Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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

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
.net NET是否有类似于Delphi';埃伯特在哪里?_.net_Delphi_Exception - Fatal编程技术网

.net NET是否有类似于Delphi';埃伯特在哪里?

.net NET是否有类似于Delphi';埃伯特在哪里?,.net,delphi,exception,.net,Delphi,Exception,NET是否有类似于Delphi的EAPort的异常 目前,我定义了自己的“AbortProcess”继承异常。 以及忽略“AbortProcess”的My.Application.UnhandledException处理程序 我仍然想知道.NET中是否已经存在类似的机制 Class AbortProcess Inherits System.Exception End Class Sub Abort() Throw New AbortProcess() End Sub Sub

NET是否有类似于Delphi的EAPort的异常

目前,我定义了自己的“AbortProcess”继承异常。 以及忽略“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,发现它们确实使用自定义异常(RecognitionException)作为控制流构造。结合Python的StopIteration用法,我相信使用Exception作为控制流构造实际上已经被广泛使用。它只是不像Delphi VCL那样被标准化。

我知道的唯一一个是“调用中止方法时引发的异常。”

如果您想在.Net中快速退出应用程序,异常不是最佳路径。您显式抛出的任何异常都可能被捕获并接受。如果使用正确的技巧,即使是像ThreadAbortException这样危险的异常也会被捕获

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


当CLR抛出堆栈溢出(不提供自定义主机)时,它是一个不可修补的异常,因此可能会或有意创建一个堆栈溢出场景

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

异常不应用于处理数据流。若您认为某些东西可能会失败,您可以抛出异常,但在第一个适当的时刻捕获它。让异常落在UnhandledException函数中,并将其吞没,这是一种糟糕的做法,可能会使应用程序处于未知状态(因为异常通过的所有方法都将被“中止”)

在这种情况下,如果您需要该sub中的异常,我将在调用时捕获它:

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

通过这种方式,异常会在接近其来源的地方被捕获,并且任何清理都仅限于该函数。所有其他异常都将传递给UnhandledException函数,在该函数中,您可以做的最好的事情是报告错误并关闭应用程序。

有两个特性定义了Delphi的
EAPort
异常类

  • IDE预先配置为在检测到引发该类的异常时不会中断程序
  • 主应用程序异常处理程序识别
    EAbort
    及其子体,并且在捕获此类异常时不显示通常的消息框
  • 看起来您提出的代码完成了第二部分。您可以为第一部分配置VisualStudio;参考另一个堆栈溢出问题的答案,我不知道已经为此指定了任何异常类


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

    正如您在代码示例中所注意到的,这个假设的异常显然不是用来终止应用程序的。这意味着中止当前事件处理程序并返回消息循环。Yike!谁他妈的投我反对票?!?!?!?我只是一个尝试进入.NET编程的Delphi程序员。我发现.NET中缺少一些Delphi概念,所以我在这里询问正确的方法。这有什么不对?!?!?!?