Использование блока 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
, см. в разделе о лучших методиках обработки исключений.