我一直在试图弄清楚异常在Racket中是如何工作的,但是我对异常谓词有点困惑。要捕获例如exn:fail
类型的异常,可以在with-handlers
表达式中使用谓词exn:fail?
对其进行测试。我已经找到了exn:fail
的文档,但我没有看到exn:fail?
的文档。我对此如此好奇的原因是,根据本文,如果您为exn:no-vowels
创建一个自定义异常结构,那么您仍然可以使用exn:no-vowels?
,尽管这个谓词从未手动实现过。如果我不得不猜测,谓词一定是用宏自动生成的,但如果是这样,我很想知道这个"自动生成谓词的行为"在哪里?详细说明了宏的工作原理。
exn
和派生的异常类型(如exn:fail
层次结构)都是Racket结构类型的实例,谓词、构造函数和访问器(如exn-message
)在使用struct
宏创建时自动定义。
用户定义的异常类型可以从struct-out
模块导出为provide
形式,导出所有生成的函数,而无需手动列出它们。