在引入新的异常类型时,我总是但不确定如何正确地执行此操作。有共同的约定吗?你怎么做呢?
我对您组织它们的范围感兴趣(将它们保存在它们所使用的单元中?在组件级别上有一个单元吗?包级别?应用程序?)
这也会影响命名。你包括多少背景?是否更好地使它们非常具体(如EPersonIDNotFoundError)或尝试使它们可重用(如ENotFoundError)?
后缀“错误”怎么办 - 什么时候应该添加它并何时离开呢?我无法看到逻辑,例如在Classes.pas
:
EWriteError = class(EFilerError);
EClassNotFound = class(EFilerError);
EResNotFound = class(Exception);
答案 0 :(得分:6)
我所知道的唯一真正的约定是用E
作为前缀。
我过去并没有真正考虑过这个问题,但现在我想起来了,在我看来Error
和Exception
通常都被用作后缀。如果你把它们混合起来,我会说Exception
与意外出错的事情有关,比如连接被破坏,或者文件结果是不可读的,而错误与错误的输入有关,实例一个数字是预期的,但有人输入了文字。
VCL似乎也遵循某些约定,但似乎只有在没有它的情况下才会添加后缀,例如
EConvertError,EMathError,EVariantError
VS
EAccessViolation,EInvalidPointer,EZeroDivide
后者描述错误本身,其中第一个列表需要后缀来指示某个进程或实体中的错误。
这些示例可以在SysUtils中找到,也许您可以查看一下,因为它包含许多异常类以及更大量异常的基类。其中很少有人以Exception
结尾,除了一些确实你希望永远不会遇到的非常具体的错误,例如EHeapException和ESafecallException。
答案 1 :(得分:1)
创建新的异常时,我将其应用于应用程序。我从最详细的错误开始到最一般的错误,比如类(Exception),并相应地命名它们。
因此,在您的示例中,我将使用EPersonIDNotFoundError,ENotFoundError,Exception。
这实际上取决于您希望从错误消息中获取多少详细信息以及您在日志中包含的内容(如果您保留错误日志)
答案 2 :(得分:1)
通常,对于简单的应用程序,您可以使用Exception.Create('ErrorMessage')。异常变得强大的地方是能够通过查看类来检测所需的响应类型。 Delphi已经通过Abort程序完成了这项工作,该程序引发了EAbort。 EAbort是“特殊的”,因为它不会触发“错误”,即它是一种“无声”异常。您可以使用此特定于类的操作来检查异常并执行不同的操作。你可以创建一个EMyWarning,EMyVeryNastyError等,每个都来自基本的Exception类型。
此外,您可以定义一个新的异常类,以便将更多信息传递到捕获异常的位置。例如,使用代码(未选中):
EMyException = class( Exception )
constructor Create( const AErrorMessage : string; AErrorCode : integer ); reintroduce;
PUBLIC
ErrorCode : integer
end;
constructor EMyException.Create( const AErrorMessage : string; AErrorCode : integer );
begin
inherited Create( AErrorMessage );
ErrorCode := AErrorCode;
end;
现在,您可以在引发异常时设置“ErrorCode”,并在捕获异常时使其可用。例外非常强大。
答案 3 :(得分:1)
将它们组织在哪个范围内?
在整个应用程序中使用一个单元,尝试适合最常见的例外情况。其他所有内容都会进入抛出异常的单元。如果您需要在其他单元中使用这些例外,请将它们移动到您正在使用的子系统使用的公共单元。
如何命名?
尝试制作一个或两个级别的“常规”例外,例如ENotFoundError
。将这些放在应用程序全局文件中。不要太努力概括,因为你不知道什么异常将来要求你改变一切。在单元级别上创建从全局级别继承的专用异常。
“错误”后缀怎么样?
不要再考虑了。 Add it.除非听起来很愚蠢。