我一直在我的代码中使用throw new Exception("...")
,因为我找不到任何其他可用的东西。我正在寻找C++'s out_of_range
和logic_error
类等内容。
std.exception
定义了一些函数来帮助处理处理异常,但没有实际类型。
我们是要定义所有自己的异常,还是只用Exception
?
答案 0 :(得分:7)
在Phobos的大部分内容中,每个模块都有自己的以模块命名的异常类型 - 例如std.utf为UTFException
,std.file为FileException
。有一些没有(例如std.concurrency有几种异常类型 - MessageMismatch
,OwnerTerminated
等),但这是整体趋势。因此,没有创建异常类型的想法,程序员将自己实例化它们。没有什么可以阻止您使用任何现有的异常类型,但在大多数情况下,重用它们没有意义,因为它们是特定于模块而不是特定于用例。
现在,与C ++的out_of_range
和logic_error
类型最接近的类比将是Error
而不是Exception
s - 特别是core.exception.RangeError
和{{1} }。 core.exception.AssertError
是不同的,不打算从中恢复。 core.exception定义了其中的几个(包括Error
)。你通常不会自己使用它们,但如果你愿意,你可以。 OutOfMemoryError
是AssertError
失败时抛出的内容。
因此,要清楚,assert
是基本异常类型。 Throwable
和Error
来自Exception
。任何不是从Throwable
派生的异常类型都会跳过析构函数,范围语句和最后的块,并且不意图从中恢复。存在几个标准Exception
- 主要在core.exception中找到,但如果需要,可以定义自己的。{1}}。除了使用Error
之外,您可能不会经常使用或定义Error
。
另一方面,从assert
派生的任何内容都是可以恢复的,将触发析构函数,范围语句和最后的块。 不通常是标准Exception
- 您将在自己的代码中实例化的派生类型。你捕获了Phobos定义的Exception
,但你通常不会抛出它们。相反,您可以直接实例化Exception
,也可以使用自己的Exception
派生类型。
使用enforce
和enforceEx
而不是直接抛出异常也常常被认为是一种好习惯(尽管显然有一种情况是直接抛出异常更合理。)
答案 1 :(得分:0)
druntime defines a few。在特定模块中还有特定的错误errno等。