创建和引发异常
异常用于指示在运行程序时发生了错误。此时将创建一个描述错误的异常对象,然后使用 throw 关键字“引发”该对象。然后运行时搜索最兼容的异常处理程序。
当存在下列一种或多种情况时,程序员应引发异常:
方法无法完成其中定义的功能。
例如,如果方法的参数具有无效值:
static void CopyObject(SampleClass original)
{
if (original == null)
{
throw new System.ArgumentException("Parameter cannot be null", "original");
}
}
根据对象的状态,对某个对象进行不适当的调用。
一个示例可能尝试对只读文件执行写操作。在对象状态不允许某项操作的情况下,引发 InvalidOperationException 的一个实例或基于此类的派生类的对象。以下为引发 InvalidOperationException 对象的方法的示例:
class ProgramLog
{
System.IO.FileStream logFile = null;
void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {}
void WriteLog()
{
if (!this.logFile.CanWrite)
{
throw new System.InvalidOperationException("Logfile cannot be read-only");
}
// Else write data to the log and return.
}
}
方法的参数导致了异常。
在此情况下,应捕获原始异常并创建一个 ArgumentException 实例。原始异常应作为 InnerException 参数传递给 ArgumentException 的构造函数:
static int GetValueFromArray(int[] array, int index)
{
try
{
return array[index];
}
catch (System.IndexOutOfRangeException ex)
{
System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex);
throw argEx;
}
}
异常包含一个名为 StackTrace 的属性。此字符串包含当前调用堆栈上的方法的名称,以及为每个方法引发异常的位置(文件名和行号)。 StackTrace 对象由公共语言运行时 (CLR) 从 throw 语句点开始自动创建,因此必须从堆栈跟踪的开始点引发异常。
所有异常都包含一个名为 Message 的属性。应该设置此字符串来解释发生异常的原因。注意,不应将安全敏感信息放在消息文本中。除 Message 之外,ArgumentException 还包含一个名为 ParamName 的属性,应将该属性设置为导致引发异常的参数的名称。对于属性设置器,ParamName 应设置为 value。
公共的受保护方法应在其无法完成预期功能时引发异常。引发的异常类应该是符合错误条件的最确切的可用异常。这些异常应编写为类功能的一部分,派生类或对原始类的更新应保留相同的行为,以实现向后兼容性。










