有没有标准的例外?

时间:2011-11-15 23:15:18

标签: exception-handling d standard-library

我一直在我的代码中使用throw new Exception("..."),因为我找不到任何其他可用的东西。我正在寻找C++'s out_of_rangelogic_error类等内容。

std.exception定义了一些函数来帮助处理处理异常,但没有实际类型。

我们是要定义所有自己的异常,还是只用Exception

2 个答案:

答案 0 :(得分:7)

在Phobos的大部分内容中,每个模块都有自己的以模块命名的异常类型 - 例如std.utf为UTFException,std.file为FileException。有一些没有(例如std.concurrency有几种异常类型 - MessageMismatchOwnerTerminated等),但这是整体趋势。因此,没有创建异常类型的想法,程序员将自己实例化它们。没有什么可以阻止您使用任何现有的异常类型,但在大多数情况下,重用它们没有意义,因为它们是特定于模块而不是特定于用例。

现在,与C ++的out_of_rangelogic_error类型最接近的类比将是Error而不是Exception s - 特别是core.exception.RangeError和{{1} }。 core.exception.AssertError是不同的,不打算从中恢复。 core.exception定义了其中的几个(包括Error)。你通常不会自己使用它们,但如果你愿意,你可以。 OutOfMemoryErrorAssertError失败时抛出的内容。

因此,要清楚,assert是基本异常类型。 ThrowableError来自Exception。任何不是从Throwable派生的异常类型都会跳过析构函数,范围语句和最后的块,并且意图从中恢复。存在几个标准Exception - 主要在core.exception中找到,但如果需要,可以定义自己的。{1}}。除了使用Error之外,您可能不会经常使用或定义Error

另一方面,从assert 派生的任何内容都是可以恢复的,触发析构函数,范围语句和最后的块。 通常是标准Exception - 您将在自己的代码中实例化的派生类型。你捕获了Phobos定义的Exception,但你通常不会抛出它们。相反,您可以直接实例化Exception,也可以使用自己的Exception派生类型。

使用enforceenforceEx而不是直接抛出异常也常常被认为是一种好习惯(尽管显然有一种情况是直接抛出异常更合理。)

答案 1 :(得分:0)

druntime defines a few。在特定模块中还有特定的错误errno等。