C# 程序员使用 try 块来对可能受异常影响的代码进行分区,并使用 catch 块来处理所产生的任何异常。不管是否引发异常,都可以使用 finally 块来执行代码 -- 有时必须这样做,因为如果引发异常,将不执行 try/catch 构造后面的代码。try 块必须与 catch 或 finally 块一起使用,并且可以包括多个 catch 块。例如:
C# | 复制代码 |
---|
try
{
// Code to try here.
}
catch (System.Exception ex)
{
// Code to handle exception here.
}
|
C# | 复制代码 |
---|
try
{
// Code to try here.
}
finally
{
// Code to execute after try here.
}
|
C# | 复制代码 |
---|
try
{
// Code to try here.
}
catch (System.Exception ex)
{
// Code to handle exception here.
}
finally
{
// Code to execute after try (and possibly catch) here.
}
|
没有 catch 或 finally 块的 try 语句将产生编译器错误。
Catch 块
catch 块可以指定要捕捉的异常类型。这个类型称为“异常筛选器”,它必须是 Exception 类型,或者必须从此类型派生。应用程序定义的异常应当从 ApplicationException 派生。
具有不同异常筛选器的多个 catch 块可以串联在一起。多个 catch 块的计算顺序是从顶部到底部,但是,对于所引发的每个异常,都只执行一个 catch 块。与所引发异常的准确类型或其基类最为匹配的第一个 catch 块将被执行。如果没有任何 catch 块指定匹配的异常筛选器,那么将执行没有筛选器的 catch 块(如果有的话)。重要的是将具有最具体的(派生程度最高的)异常类的 catch 块放在最前面。
应捕捉异常的情况:
Finally 块
finally 块允许清理在 try 块中执行的操作。如果存在 finally 块,它将在执行完 try 和 catch 块之后执行。finally 块始终会执行,而与是否引发异常或者是否找到与异常类型匹配的 catch 块无关。
finally 块可以用来释放资源,而不用等待由运行库中的垃圾回收器来终结对象。有关更多信息,请参见 using 语句(C# 参考)。
在此示例中,finally 块用来关闭在 try 块中打开的文件。注意,在关闭文件句柄之前要检查它的状态。如果 try 块未能打开文件,则文件句柄仍将设置为 null。或者,如果成功打开文件并且没有引发异常,则 finally 块仍将执行,并且将关闭打开的文件。
C# | 复制代码 |
---|
System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
file = fileinfo.OpenWrite();
file.WriteByte(0xF);
}
finally
{
if (file != null)
{
file.Close();
}
}
|
C# 语言规范
有关更多信息,请参见 C# 语言规范中的以下各章节:
-
16 异常
-
8.9.5 throw 语句
-
8.10 try 语句
请参见