Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中记录引发的异常?_Delphi_Exception Handling_Documentation - Fatal编程技术网

如何在Delphi中记录引发的异常?

如何在Delphi中记录引发的异常?,delphi,exception-handling,documentation,Delphi,Exception Handling,Documentation,我经常调用一个函数Foo,想知道这个函数可能抛出什么异常。为了找到答案,我接着研究了Foo的实现,但这还不够Foo确实可能调用引发异常的函数Bar 有时我甚至会错过Java的检查异常处理 因此,我认为有必要记录每个函数可以抛出的异常:问题是:如何?是否有关于如何记录异常的最佳实践?您如何处理这个问题?我们使用Javadoc风格的注释来编写文档。我们提取信息并使用一些简单的文本脚本生成输出。我们也使用了DelphiCodeToDoc 在记录异常时,我们要求使用@throws标记。大多数Delphi

我经常调用一个函数
Foo
,想知道这个函数可能抛出什么异常。为了找到答案,我接着研究了
Foo
的实现,但这还不够
Foo
确实可能调用引发异常的函数
Bar

有时我甚至会错过Java的检查异常处理


因此,我认为有必要记录每个函数可以抛出的异常:问题是:如何?是否有关于如何记录异常的最佳实践?您如何处理这个问题?

我们使用Javadoc风格的注释来编写文档。我们提取信息并使用一些简单的文本脚本生成输出。我们也使用了DelphiCodeToDoc


在记录异常时,我们要求使用@throws标记。

大多数Delphi应用程序都是VCL应用程序。它们不需要检查异常,因为主消息循环有一个try/except块捕获所有内容

不过,记录代码可以显式引发哪些异常可能是一种很好的做法

我会使用XMLDoc来实现这一点(XMLDoc上有她,等等)

但是请注意,底层代码也可能引发异常。根据您对库的影响,您可以或不能确保这些库始终是相同的。操作系统则不同:根据您运行的位置,您可以获得不同的异常


--杰罗恩

我认为这涵盖了你意识到的问题的一部分

我使用XMLDoc注释(请参阅链接和讨论)。它基本上是在接口部分的属性或方法声明上方向代码添加一种特殊类型的注释。下面是一个毫无意义的注释(当然)如果您在代码中添加类似样式的注释,那么在编写代码时调用它时,它们会在代码洞察中弹出,就像VCL的文档一样

type
  {$REGION 'TMyClass description'}
  /// <summary>TMyClass is a descendent of TComponent 
  /// which performs some function.</summary>
  {$ENDREGION}
  TMyClass=class(TComponent)
  private
    // your private stuff
    FSomeProp: Boolean;
    procedure SetSomeProp(Value: Boolean);
  protected
    // your protected stuff
  public
    {$REGION 'TMyClass constructor'}
    /// <summary> TMyClass constructor.</summary>
    /// <remarks>Creates an instance of TMyClass.</remarks>
    /// <param>Owner: TObject. The owner of the instance of TMyClass</param>
    /// <exception>Raises EMyObjectFailedAlloc if the constructor dies
    /// </exception>
    {$ENDREGION}
    Create(Owner: TObject); override;
  published
    {$REGION 'TMyClass.Someprop'}
    /// <summary>Someprop property</summary>
    /// <remarks>Someprop is a Boolean property. When True, the
    /// thingamajig automatically frobs the widget. Changing this
    /// property also affects the behavior of SomeOtherProp.</remarks>
    {$ENDREGION}
  property Someprop: Boolean read FSomeProp write SetSomeProp;
  end;
类型
{$REGION'TMyClass description'}
///TMyClass是TComponent的后代
///它执行一些功能。
{$ENDREGION}
TMyClass=类(TComponent)
私有的
//你的私人物品
FSomeProp:Boolean;
过程SetSomeProp(值:布尔值);
受保护的
//你受保护的东西
公众的
{$REGION'TMyClass构造函数'}
///TMyClass构造函数。
///创建TMyClass的实例。
///所有者:TObject。TMyClass实例的所有者
///如果构造函数死亡,则引发EMyObjectFailedAlloc
/// 
{$ENDREGION}
创建(所有者:TObject);重写;
出版
{$REGION'TMyClass.Someprop'}
///Someprop属性
///Someprop是一个布尔属性。如果为True,则
///thingamajig会自动冻结小部件。更改此
///属性还影响其他属性的行为。
{$ENDREGION}
属性Someprop:Boolean read FSomeProp write SetSomeProp;
结束;

我更喜欢将这些XMLDoc注释包装在区域中,这样它们就可以折叠起来,除非我想编辑它们。我在上面已经这样做了;如果您不喜欢它们,请删除带有{$REGION}和{$ENDREGION}的行

这对于记录代码来说非常有用-从DevJet.net

我使用PasDoc来记录我几乎所有的Delphi项目。它包括一个“raises”标记,可以满足您的要求

问候
-Turio

既然异常是跨方法边界抛出的,那么这有什么用呢?我的意思是,如果A调用B抛出F,然后B调用C抛出G等等,那么方法A只能抛出异常E。我的意思是,你能用这些信息进行什么有用的分析?@David:你可以添加异常由
B
抛出到
A
的文档中。区别在于您只执行一次(在编写
A
时)而且并非每次使用
A
。不幸的是,这似乎是一场维护噩梦-更改
B
的异常处理现在需要使用
B
更改所有函数的文档-非常难看indeed@smasher你需要一个工具来做这件事,我不知道这样的工具怎么会存在。很高兴看到你是using DelphiCodeToDoc:)为什么您想知道可能会引发哪些异常?捕捉异常的情况非常罕见,因此了解特定类型的需求也非常罕见;同时,您应该假设异常几乎可以在任何点抛出,例如范围检查、浮点、零指针使用的访问冲突等@Barry:可能有几个原因(1)可能我想捕获一个异常并抛出另一个异常(更合适的一个)(2)我可能想向用户显示不同的错误对话框(或无错误对话框,具体取决于上下文)。我不是在说访问违规之类的意外异常。这不是答案,而是对伟大链接的+1。感谢它令人印象深刻的WYSIWYG编辑器,您不需要知道任何XML文档语法,您可以自然愉快地编写文档。只需一个提示,Documentation Insight就可以自动将文档包含在其中一个地区。