他你可能想要复用的标准异常还有
IndexOutOfRangeException和ArithmeticException等等。 4.5 System.Exception类还有什么有用的特性吗? 是的,那就是
StackTrace属性。这个属性提供了一个调用栈,其中记录了异常最初被抛出的位置。例如,下列代码: using System;
class CApp
{
public static void Main()
{
try
{
f();
}
catch( Exception e )
{
Console.WriteLine( "System.Exception stack trace = \n{0}", e.StackTrace );
}
}
static void f()
{
throw new Exception( "f went pear-shaped" );
}
}
会产生如下输出:
System.Exception stack trace =
at CApp.f()
at CApp.Main()
但是,请注意:这种调用栈跟踪能力只有在调试版本中才会有。发布版本会把某些方法调用优化掉,这也就是说,调用栈将与你所想象的形式有所不同。
4.6 我应该在何时抛出异常? 这是一个颇有争议的话题,而且也部分取决于个人的喜好。不过,大多数人都接受这样一个观点:只有在出现“预料之外”的错误时,才应该抛出异常。如何判断一个错误是预料之中的还是预料之外的呢?各人的判断不同。这里有一个简单的例子:因为
seek指针到达文件末尾而引起的文件读取错误应该属于预料之中的错误,而在堆上分配内存失败则应该属于预料之外的错误。 4.7 C#有throws子句吗? 没有。和
Java不同,C#并不要求(甚至并不允许)开发者指定方法可以抛出的异常。 5. 运行时类型信息 5.1 如何在运行时检查对象的类型? 你可以使用
is关键字。例如: using System;
class CApp
{
public static void Main()
{
string s = "fred";
long i = 10;
Console.WriteLine( "{0} is {1}an integer", s, (IsInteger(s) ? "" : "not ") );
Console.WriteLine( "{0} is {1}an integer", i, (IsInteger(i) ? "" : "not ") );
}
static bool IsInteger( object obj )
{
if( obj is int || obj is long )
return true;
else
return false;
}
}
会