【问题标题】:Are there any standard exceptions?有标准例外吗?
【发布时间】:2011-12-29 23:31:10
【问题描述】:
我一直在我的代码中使用throw new Exception("..."),因为我找不到其他可以使用的东西。我正在寻找类似 @987654321@ out_of_range 和 logic_error 类的东西。
std.exception 定义了一些函数来帮助处理异常,但没有实际的类型。
我们是要定义我们自己的所有异常,还是 Exception 只是用于所有事情?
【问题讨论】:
标签:
exception-handling
d
standard-library
【解决方案2】:
在 Phobos 中,大多数情况下,每个模块都有自己的以模块命名的异常类型 - 例如UTFException 用于 std.utf,FileException 用于 std.file。有一些没有(例如 std.concurrency 有几种异常类型 - MessageMismatch、OwnerTerminated 等),但这是总体趋势。因此,没有以程序员自己实例化它们的想法创建异常类型。没有什么可以阻止您使用任何现有的异常类型,但在大多数情况下,重用它们没有意义,因为它们是特定于模块而不是特定于用例的。
现在,与 C++ 的 out_of_range 和 logic_error 类型最接近的类比是 Errors 而不是 Exceptions - 特别是 core.exception.RangeError 和 core.exception.AssertError。 Errors 是不同的,不打算从中恢复。 core.exception 定义了其中的几个(包括OutOfMemoryError)。你通常不会自己使用这些,但如果你愿意,你可以。 AssertError 是 assert 失败时抛出的内容。
所以,需要明确的是,Throwable 是基本异常类型。 Error 和 Exception 派生自 Throwable。任何不是从Exception 派生的异常类型都会跳过析构函数、范围语句和 finally 块,并且不打算从中恢复。存在几个标准的Errors - 主要在 core.exception 中找到,但如果需要,您可以定义自己的。你可能不会经常使用或定义Errors - 除了使用assert。
另一方面,从Exception 派生的任何东西都是旨在可恢复的,并且将触发析构函数、范围语句和 finally 块。 不通常是标准的Exception 派生类型,您可以在自己的代码中实例化它们。你会捕捉到 Phobos 定义的 Exceptions,但你通常不会扔掉它们。相反,您要么直接实例化 Exception,要么使用自己的 Exception 派生类型。
使用enforce 和enforceEx 而不是直接抛出异常也经常被认为是一种好习惯(尽管在某些情况下直接抛出异常显然更有意义)。