【问题标题】:Are there any standard exceptions?有标准例外吗?
【发布时间】:2011-12-29 23:31:10
【问题描述】:

我一直在我的代码中使用throw new Exception("..."),因为我找不到其他可以使用的东西。我正在寻找类似 @​​987654321@ out_of_rangelogic_error 类的东西。

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

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

【问题讨论】:

标签: exception-handling d standard-library


【解决方案1】:

druntime defines a few。在特定模块中也有针对 bad errno 等的特定模块。

【讨论】:

    【解决方案2】:

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

    现在,与 C++ 的 out_of_rangelogic_error 类型最接近的类比是 Errors 而不是 Exceptions - 特别是 core.exception.RangeErrorcore.exception.AssertErrorErrors 是不同的,不打算从中恢复。 core.exception 定义了其中的几个(包括OutOfMemoryError)。你通常不会自己使用这些,但如果你愿意,你可以。 AssertErrorassert 失败时抛出的内容。

    所以,需要明确的是,Throwable 是基本异常类型。 ErrorException 派生自 Throwable。任何不是从Exception 派生的异常类型都会跳过析构函数、范围语句和 finally 块,并且打算从中恢复。存在几个标准的Errors - 主要在 core.exception 中找到,但如果需要,您可以定义自己的。你可能不会经常使用或定义Errors - 除了使用assert

    另一方面,从Exception 派生的任何东西都是旨在可恢复的,并且触发析构函数、范围语句和 finally 块。 通常是标准的Exception 派生类型,您可以在自己的代码中实例化它们。你会捕捉到 Phobos 定义的 Exceptions,但你通常不会扔掉它们。相反,您要么直接实例化 Exception,要么使用自己的 Exception 派生类型。

    使用enforceenforceEx 而不是直接抛出异常也经常被认为是一种好习惯(尽管在某些情况下直接抛出异常显然更有意义)。

    【讨论】:

    • 感谢您对错误与异常的精彩解释。
    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2021-06-07
    • 1970-01-01
    • 2010-12-03
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多