在调试期间,可以随时使用 exception 命令显示异常的类型。如果使用 exception 命令时不带选项,则所示类型由 dbx 环境变量 output_dynamic_type 的设置确定:
如果设置为 on,则显示派生类型。
如果设置为 off(缺省值),则显示静态类型。
如果指定 -d 或 +d 选项,则会覆盖环境变量的设置:
如果指定 -d,则显示派生类型。
如果指定 +d,则显示静态类型。
有关更多信息,请参见exception 命令。
可以在堆栈展开之前拦截或捕获特定类型的异常。使用不带参数的 intercept 命令可列出正在拦截的类型。使用 -all 可拦截所有异常。使用 typename 可将类型添加到拦截列表中。使用 -x 可从排除列表中排除特定类型,从而不拦截该类型。使用 -set 可清除拦截列表和排除列表,并将列表设置为仅拦截或排除指定类型的抛出。
例如,要拦截除 int 之外的所有类型,可键入:
(dbx) intercept -all -x int |
要拦截类型为 Error 的异常,可键入:
(dbx) intercept Error |
如果拦截的 CommonError 异常过多,可键入以下内容排除这些异常:
(dbx) intercept -x CommonError |
如果键入不带参数的 intercept 命令,则会发现拦截列表中包括未处理的异常和意外的异常(缺省情况下将拦截这些异常),以及 Error 类的异常(CommonError 类的异常除外)。
(dbx) intercept -unhandled -unexpected class Error -x class CommonError |
如果您随后意识到 Error 不是您需要的异常类,但是不知道要查找的异常类的名称,则可以通过键入以下内容来尝试拦截除 Error 类异常之外的所有异常:
(dbx) intercept -all -x Error |
有关更多信息,请参见intercept 命令。
使用 unintercept 命令可从拦截列表或排除列表中删除异常类型。使用不带参数的命令可列出正在拦截的类型(与 intercept 命令相同)。使用 -all 可从拦截列表中删除所有类型。使用 typename 可从拦截列表中删除一个类型。使用 -x 可从排除列表中删除一个类型。
有关更多信息,请参见unintercept 命令。
如果在当前执行点抛出异常,whocatches 命令会报告捕获类型为 typename 的异常的位置。使用此命令可查出自栈的顶帧抛出异常时会发生什么情况。
捕获 typename 的 catch 子句的行号、函数名和帧号均会显示出来。如果捕获点所在函数与抛出异常的函数相同,则该命令返回 "type is unhandled"。
有关更多信息,请参见whocatches 命令。