Exception handling 是否有任何标准的例外情况?

Exception handling 是否有任何标准的例外情况?,exception-handling,d,standard-library,Exception Handling,D,Standard Library,我一直在我的代码中使用抛出新异常(“…”),因为我找不到其他可用的东西。我在找一些东西,比如课程 定义了一些函数来帮助处理异常,但没有实际的类型 我们是要定义我们自己的所有异常,还是只将异常用于所有事情?。在特定模块中,也有针对坏错误等的特定错误 对于火卫一中的大多数模块,每个模块都有自己的以模块命名的异常类型-例如std.utf的utfeexception和std.file的FileException。有一些没有(例如,std.concurrency有几种异常类型-消息不匹配,所有者终止,等等

我一直在我的代码中使用
抛出新异常(“…”)
,因为我找不到其他可用的东西。我在找一些东西,比如课程

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


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

。在特定模块中,也有针对坏错误等的特定错误

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

现在,与C++的
out\u of u range
logic\u error
类型最接近的类比是
error
s,而不是
Exception
s——具体地说是
core.Exception.RangeError
core.Exception.AssertError
<代码>错误s是不同的,不打算从中恢复。core.exception定义了其中几个(包括
OutOfMemoryError
)。你通常不会自己使用这些,但如果你愿意,你可以<代码>断言错误是当它失败时由
断言
引发的错误

因此,需要明确的是,
Throwable
是基本的异常类型<代码>错误和
异常
是从
可丢弃性
派生出来的。任何不是从
exception
派生的异常类型都会跳过析构函数、作用域语句并最终阻塞,并且不打算从中恢复。存在多个标准的
错误
s-主要在core.exception中找到,但如果需要,您可以定义自己的。不过,除了使用
assert
之外,您可能不会经常使用或定义
错误

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


使用和而不是直接抛出异常(尽管在某些情况下,直接抛出异常显然更有意义)也是经常被认为的良好实践。

感谢您对错误与异常的出色解释,这可能是重复的。