throw
throw语句用于发出程序执行期间出现的反常情况(异常)的信号
引发的异常是一个对象,其类派生自System.Exception
try-catch
一个try块后面接了一个或者多个catch子句,这些子句指定不同异常的处理程序。
try块中包含可能导致异常的代码。将执行此块,直至引发异常或成功运行。
例:强制转换null对象会引发NullReferenceException异常
object o2 = null;
try
{
int i2 = (int)o2; // Error
}
尽管可以不带参数使用catch子句,但不推荐这种用法。一般情况下,只应捕获知道如何恢复的异常。
so,应该始终指定派生自System.Exception的对象参数。如:
catch (InvalidCastException e)
{
}
try-catch语句中可以有多个特定的catch子句。在这种情况下,catch子句的顺序很重要,因为catch子句是按顺序查找的。使用更笼统的子句之前应该有更针对性的异常。
筛选想要处理的异常的一种方式是使用catch子句。也可以使用if进一步检查该异常,决定是否要对该异常进行处理,如果返回值为false,则继续查找合适catch子句异常处理程序。
Catch (ArgumentException e) if (e.ParamName == “…”)
{
}
可在catch块中使用throw语句以重新引发已由catch语句捕获的异常。如:从IOException异常提取信息,然后向父方法抛出
catch (FileNotFoundException e)
{
// 这个方法处理FileNotFoundExceptions异常
}
catch (IOException e)
{
// 从这个异常中提取部分信息,然后抛给父方法
if (e.Source != null)
Console.WriteLine("IOException source: {0}", e.Source);
throw;
}
还可以捕获一个异常然后引发一个不同的异常。不过作为捕获的异常最好是内部异常,引发的异常最好是自定义异常
在try块内,仅初始化在其中声明的变量。否则,在完成执行块之前,可能会出现异常。
如:变量n在try块内初始化,在try块外使用write方法输出n,将生成编译器错误。
static void Main()
{
int n;
try
{
// 不要在这里初始化这个变量
n = 123;
}
catch
{
}
// 错误:使用了未赋值的局部变量n
Console.Write(n);
}
try-finally
使用finally块,可以清理在try中分配的任何资源,而且,即使在try块中发生异常,也可以运行代码。
已处理的异常中会确保运行关联的finally块。
如果异常未处理,则finally块的执行取决于如何触发异常展开操作。
try-catch-finally
catch和finally一起使用的常见方式是:在try块中获取并使用资源,在catch块中处理异常,并在finally块中释放资源
public class EHClass
{
void ReadFile(int index)
{
string path = @"c:\users\public\test.txt";
System.IO.StreamReader file = new System.IO.StreamReader(path);
char[] buffer = new char[10];
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);
}
finally
{
if (file != null)
{
file.Close();
}
}
}
}