在 X# 中,程序运行时出现的错误会通过异常机制在程序中传播。异常由遇到错误的代码抛出,并由可以纠正错误的代码捕获。异常可以由 .NET Framework 通用语言运行时(CLR)或程序中的代码抛出。异常一旦被抛出,就会在调用堆栈中向上传播,直到找到异常的捕获语句为止。未捕获的异常由系统提供的通用异常处理程序处理,该程序会显示一个对话框。
异常由 Exception 派生的类表示。该类可识别异常类型,并包含有关异常详细信息的属性。抛出异常包括创建一个异常派生类的实例,可选择配置异常的属性,然后使用 throw 关键字抛出对象。例如
CLASS CustomException INHERIT Exception
CONSTRUCTOR(message AS STRING)
SUPER(message)
END CLASS
FUNCTION TestThrow as VOID
LOCAL ex AS CustomException
ex := CustomException{"Custom exception in TestThrow()}
THROW ex
RETURN
异常抛出后,运行时会检查当前语句是否在 try 代码块中。如果是,运行时将检查与 try 代码块相关的 catch 代码块,看它们是否能捕获异常。catch 块通常指定异常类型;如果 catch 块的类型与异常类型相同,或者是异常的基类,则捕获块可以处理该方法。例如
FUNCTION TestCatch as VOID
TRY
TestThrow()
CATCH ex AS CustomException
System.Console.WriteLine(ex.ToString())
END TRY
RETURN
如果抛出异常的语句不在 try 代码块中,或者包围它的 try 代码块中没有匹配的 catch 代码块,运行时就会检查调用方法中的 try 语句和 catch 代码块。运行时会继续在调用栈中查找兼容的 catch 块。找到并执行捕获块后,控制权将传递给该捕获块后的下一条语句。
一个 try 语句可以包含多个 catch 块。第一个能处理异常的 catch 语句会被执行;后面的任何 catch 语句,即使是兼容的,也会被忽略。因此,catch 块的排序应从最特殊(或派生层次最深)到最不特殊。