.NET有一个类似于Delphi的EAbort的异常吗?

时间:2009-07-30 06:22:59

标签: .net delphi exception

.NET是否有类似于Delphi的EAbort的异常?

目前,我定义了自己的“AbortProcess”继承Exception。 与忽略“AbortProcess”的My.Application.UnhandledException处理程序一起使用 我仍然想知道.NET中是否存在类似的机制。

Class AbortProcess
    Inherits System.Exception
End Class

Sub Abort()
    Throw New AbortProcess()
End Sub

Sub AppDomain_UnhandledException(ByVal sender As Object, ByVal e As ApplicationServices.UnhandledExceptionEventArgs)
    If TypeOf e.Exception Is AbortProcess Then
        e.ExitApplication = False
    End If
End Sub    

Sub PerformActions()
    Action1()
    If Not Action2() Then
        Abort()
    End If
    Action3()
    ...
End Sub

典型的.NET开发人员如何处理这个用例?

更新:

由于某些原因,很多人不幸地在没有发表任何评论的情况下对这个问题投了赞成票。我能弄清楚的唯一原因是他们可能认为异常永远不应该被用来控制程序流程;我倾向于同意这一点。但是,我最近研究了ANTLR并发现它们确实使用自定义Exception(RecognitionException)作为控制流构造。结合Python的StopIteration用法,我相信使用Exception作为控制流构造实际上已经被广泛使用。它只是没有像Delphi VCL那样标准化。

4 个答案:

答案 0 :(得分:5)

定义Delphi的EAbort异常类有两个特质。

  1. 当IDE检测到正在引发该类的异常时,IDE预先配置为中断您的程序。
  2. 主应用程序异常处理程序识别EAbort及其后代,并且在捕获此类异常时不显示常用消息框。
  3. 看起来你提出的代码完成了第二部分。您可以为第一部分配置Visual Studio;请参阅另一个Stack Overflow问题的答案,Is there a better way to get Visual Studio to ignore try/catch in debug mode?我不知道已经为此指定了任何异常类。

    EAbort异常旨在使程序停止运行它正在运行的任何事件或消息处理程序,并在主消息循环中继续。但是,为了使其真正起作用,需要编写所有其他代码以正确处理异常。也就是说,他们需要使用finally部分来保持自己处于稳定和一致的状态,并且他们需要重新抛出或从不捕获他们实际上无法修复的异常。

答案 1 :(得分:0)

我唯一知道的是ThreadAbortException,它是“调用Abort方法时抛出的异常。

答案 2 :(得分:0)

如果要在.Net中快速退出应用程序,则异常不是最佳路径。您可以捕获并吞下您明确抛出的任何异常。如果你做了正确的技巧,甚至可以捕获像ThreadAbortException这样的危险异常。

快速退出应用程序的最佳方法是使用Environment.Exit。

那或者故意创建一个堆栈溢出场景,因为当它被CLR抛出(不提供自定义主机)时它是一个无法捕获的异常。

答案 3 :(得分:0)

这基本上是例外,只是作为快速退出功能。 .NET异常并不是为了这样做而吞下它们是非常糟糕的做法。

不应使用异常来处理数据流。如果您认为某些事情可能会失败,您可能会抛出异常,但在适当的时候抓住它。让异常落入UnhandledException函数并吞下它只是不好的做法,可能会使你的应用程序处于未知状态(因为所有异常的方法都将被“中止”)。

在这种情况下,如果你需要在那个sub中有异常,我会在电话中看到它:

try {
    PerformActions()
} catch (AbortProcess) {
    //do some cleaning up or just ignore
}

这种方式异常被捕获到它的原点附近,任何清理仅限于该功能。所有其他异常都将传递给您的UnhandledException函数,您可以做的最好的事情是报告错误并关闭应用程序。