如何使用 try/catch 块捕获异常

将可能引发异常的任何代码语句放置在 try 块中,将用于处理异常的语句放置在 try 块下的一个或多个 catch 块中。 每个 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 块中设置代码的建议,请参阅异常的最佳做法

请参阅