Поделиться через


Использование блока try/catch для перехвата исключений

Поместите все операторы кода, которые могут вызвать исключение, в блок try, а операторы, которые обрабатывают исключения, поместите в одном или нескольких блоках catch под блоком try. Каждый блок catch включает тип исключения и может содержать дополнительные инструкции, необходимые для обработки этого типа исключения.

В следующем примере StreamReader открывает файл с именем data.txt и извлекает строку из файла. Так как код может вызывать любое из трех исключений, он помещается в блок try. Три блока catch перехватывают исключения и обрабатывают их, отображая результаты в консоли.

using namespace System;
using namespace System::IO;

public ref class ProcessFile
{
public:
    static void Main()
    {
        try
        {
            StreamReader^ sr = File::OpenText("data.txt");
            Console::WriteLine("The first line of this file is {0}", sr->ReadLine());
            sr->Close();
        }
        catch (Exception^ e)
        {
            Console::WriteLine("An error occurred: '{0}'", e);
        }
    }
};

int main()
{
    ProcessFile::Main();
}
using System;
using System.IO;

public class ProcessFile
{
    public static void Main()
    {
        try
        {
            using (StreamReader sr = File.OpenText("data.txt"))
            {
                Console.WriteLine($"The first line of this file is {sr.ReadLine()}");
            }
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine($"The file was not found: '{e}'");
        }
        catch (DirectoryNotFoundException e)
        {
            Console.WriteLine($"The directory was not found: '{e}'");
        }
        catch (IOException e)
        {
            Console.WriteLine($"The file could not be opened: '{e}'");
        }
    }
}
Imports System.IO

Public Class ProcessFile
    Public Shared Sub Main()
        Try
            Using sr As StreamReader = File.OpenText("data.txt")
                Console.WriteLine($"The first line of this file is {sr.ReadLine()}")
            End Using
        Catch e As FileNotFoundException
            Console.WriteLine($"The file was not found: '{e}'")
        Catch e As DirectoryNotFoundException
            Console.WriteLine($"The directory was not found: '{e}'")
        Catch e As IOException
            Console.WriteLine($"The file could not be opened: '{e}'")
        End Try
    End Sub
End Class

Среда CLR перехватывает исключения, не обрабатываемые блоками catch. Если исключение перехватывается в среде CLR, в зависимости от конфигурации среды CLR может возникнуть один из следующих результатов:

  • Откроется диалоговое окно отладки.
  • Программа прекратит выполнение, и откроется диалоговое окно со сведениями об исключении.
  • В стандартном потоке вывода ошибок будет выведена ошибка.

Примечание.

Большая часть кода может создавать исключения, и некоторые исключения, например OutOfMemoryException, могут вызываться самой средой CLR в любое время. Приложениям не требуется обрабатывать эти исключения, но вы должны помнить об этом при написании библиотек, предназначенных для других пользователей. Рекомендации о том, когда следует помещать код в блок try, см. в разделе о лучших методиках обработки исключений.

См. также