Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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
我可以在C#中创建一个全局异常处理程序,让代码在之后继续运行吗?_C#_.net_Exception Handling - Fatal编程技术网

我可以在C#中创建一个全局异常处理程序,让代码在之后继续运行吗?

我可以在C#中创建一个全局异常处理程序,让代码在之后继续运行吗?,c#,.net,exception-handling,C#,.net,Exception Handling,在.NET中,默认的异常处理程序将允许用户继续运行该程序。但是,我希望有一个全局异常处理程序,将堆栈跟踪保存到一个“errorlog.txt”文件中,这样用户就可以将其发送给我,而不必记得单击“详细信息”并将其从对话框中复制出来(并删除所有关于加载的程序集之类的无用信息)。但当我这样做时,代码不知道如何继续,所以我所能做的就是退出应用程序。有什么办法可以两全其美?(是的,我知道我要求的基本上是使用日志记录的“下一次错误恢复”,但我真的认为这会很有用!)不,不存在异常,异常是一个流控制结构,因此下

在.NET中,默认的异常处理程序将允许用户继续运行该程序。但是,我希望有一个全局异常处理程序,将堆栈跟踪保存到一个“errorlog.txt”文件中,这样用户就可以将其发送给我,而不必记得单击“详细信息”并将其从对话框中复制出来(并删除所有关于加载的程序集之类的无用信息)。但当我这样做时,代码不知道如何继续,所以我所能做的就是退出应用程序。有什么办法可以两全其美?(是的,我知道我要求的基本上是使用日志记录的“下一次错误恢复”,但我真的认为这会很有用!)

不,不存在异常,异常是一个流控制结构,因此下一次错误恢复时不可能出现

您可以在循环中执行操作,如果出现异常,请重试您的逻辑


KandallFrey是对的,但是,您不应该使用异常作为流控制,只在异常情况下使用它们。

不,这是不存在的,异常是流控制结构,因此在错误恢复下一步时不可能使用

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
您可以在循环中执行操作,如果出现异常,请重试您的逻辑

KandallFrey是对的,但是,您不应该使用异常作为流控制,只在异常情况下使用它们

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
如果在应用程序启动时将自己绑定到此事件,则应该能够捕获应用程序引发的任何未经处理的异常,并将其保存到文件中。(使用
未处理的ExceptionEventArgs
异常
对象部分。我认为无法从发生错误的位置恢复


如果在应用程序启动时将自己绑定到此事件,则应该能够捕获应用程序引发的任何未经处理的异常,并将其保存到文件中。(使用
未处理异常ventargs
异常
对象部分。我认为不可能从错误发生的地方恢复。

我使用
My.Application.UnhandledException
打开一个对话框表单,用户可以在其中保存有关异常的所有信息


当表单关闭时,我调用
e.ExitApplication=False

我使用
My.Application.UnhandledException
打开一个对话框表单,用户可以在其中保存有关异常的所有信息


当窗体关闭时,我调用
e.ExitApplication=False

您可以编写一个全局异常处理程序方法,在每个
catch
块中调用该方法,该方法在您希望保存堆栈跟踪的任何位置写入堆栈跟踪。但是您需要为每个需要它们的操作编写
try…catch
块,并调用每种类型中的异常处理程序


您还可以在MyApplication.UnhandledException处理程序中为所有未处理事件调用该全局异常处理程序方法。但在这种情况下,当控件访问该方法时,程序将不会继续运行。

您可以编写一个全局异常处理程序方法,在每个
catch
块中调用该方法,而ch将堆栈跟踪写入您希望保存它的任何位置。但是您需要为每个需要它们的操作编写
try…catch
块,并在每个操作中调用异常处理程序


你也可以在MyApplication.UnhandledException处理程序中为所有未处理的事件调用该全局异常处理程序方法。但在这种情况下,当控制权转到该方法时,程序将无法继续运行。

在我的公司,我建立了一个异常处理框架,该框架已经为我服务了7年。Every程序集引用DLL,每个程序集中的每个方法都有一个try-catch块。在catch中,我基本上必须根据以下问题做出一个决定:“我希望我的异常处理框架在哪里进行干预,即从外部记录异常数据并将问题通知用户?”。在大多数情况下,这个问题的答案是,我希望它在外部调用该方法的情况下进行干预,例如,如果它在事件处理程序或其他委托中。下面是一些示例代码:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Try
        Method1()
    Catch ex As Exception
        BSExceptionHandler.ProcessException(BSExceptionHandler.GetBSException(ex, BSExceptionHandler.GetThisMethodName))
    End Try
End Sub

Private Sub Method1()
    Try
        method2()
    Catch ex As Exception
        Throw BSExceptionHandler.GetBSException(ex, BSExceptionHandler.GetThisMethodName)
    End Try
End Sub

Private Sub method2()
    Try
        Dim x As Integer = CInt("x") 'exception thrown here.
    Catch ex As Exception
        Throw BSExceptionHandler.GetBSException(ex, BSExceptionHandler.GetThisMethodName)
    End Try
End Sub
当在
Method2()
中第一次调用
Throw BSExceptionHandler.GetBSException(例如,BSExceptionHandler.GetThisMethodName)
时,原始异常被包装在一个
BSException
中,并且原始方法名称也被存储(稍后将详细介绍).BSExceptionHandler.GetBSException(例如,BSExceptionHandler.GetThisMethodName)
的任何后续调用,例如在
Method1()
中,都将识别异常已经是类型
BSException
的异常,只需抛出该异常,而不是重新包装它。最终,它将到达调用堆栈的“顶部”(实际上不是顶部,只是我决定通过我的框架处理异常的那一点——即记录它,通知用户,等等)——在本例中,在
按钮1中单击
——然后调用
BSExceptionHandler.ProcessException(BSExceptionHandler.GetBSException(例如,BSExceptionHandler.GetThisMethodName))

我的框架在
ProcessException
中所做的是确定系统上配置的报告类型。这默认为“简单”,这意味着用户将获得一个非常通用且侵入性最小的对话框,指示出现了问题,并指示他们联系IT部门。但是,有一个可选的注册表设置,它将报告类型设置为“详细”或“电子邮件”。我使用“详细”在我的开发机器上,因为它在对话框中包含所有异常信息,所以我不必查看日志。在没有用户登录的情况下运行应用程序的服务器上使用“电子邮件”选项;在这种情况下,错误信息通过电子邮件发送给it部门,以提醒他们该问题

另一个是t
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
   MessageBox.Show(eventArgs.Exception.ToString());
};