.NET写入事件处理程序以捕获本地异常

时间:2018-08-02 18:37:53

标签: c# vb.net events exception-handling

我正在为用VB.NET编写的旧代码库编写记录器,其中包含许多事件和函数,其格式为:

Try
    'Do some stuff here'
Catch ex As Exception
    'Handle the exception here'
EndTry

Try语句是方法的第一行,EndTry是方法的最后一行。由于多年来未对代码进行维护,因此没有人确定是否确实需要尝试。现在,我编写了一个单例类,该类连接到日志记录框架中,我可以这样称呼它:

With New MyLogger().Logger
    Try
        'Do some stuff here'
    Catch ex As Exception
        .Log("Some message", ex)
    EndTry
EndWith

其中MyLogger用.NET 4.0编写。我在这里想要做的是删除内部try-catch并将其替换为MyLogger中的某些事件处理程序。我已经连接了AppDomain.CurrentDomain.UnhandledException,但我的理解是,该事件只会在异常发生的情况下引发,该异常会一直贯穿应用程序而不会被捕获。我是否可以处理一个仅捕获异常的事件,该异常会使其进入在其中更新对象的给定范围?也许看起来像这样:

public MyLogger()
{
    Something.CurrentScope.UnhandledException += MyHandler;
}

private MyHandler(object sender, UnhandledExceptionEventArgs args)
{
    // log the exception here
}

具有以下VB.NET代码:

With New MyLogger().Logger
    'Do some stuff here'
EndWith

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

基于最新问题的可能答案

似乎您正在寻找范围内的处理程序,我很肯定没有这样的事情。

但是,您提出了:

With New MyLogger().Logger
    Try
        'Do some stuff here'
    Catch ex As Exception
        .Log("Some message", ex)
    EndTry
EndWith

应通过适当的初始化将其简化为以下内容:

With New MyLogger().Logger
    'Do some stuff here'
EndWith

我认为lambda包装器可以在这里为您提供帮助:

本质上,您将不用做With Logger ... EndWith

MyLogger().DoWithCatch(
  Sub()
    ' Do some stuff here
  End Sub
)

其中DoWithCatch的实现方式

Sub DoWithCatch(ByVal lambda As Sub())
  Try
    lambda()
  Catch ex As Exception
    Log("Some message", ex)
  EndTry
End Sub

我认为您明白了。

这样,您只需编写catch块一次。

我首先说的

可能,您正在寻找的是:AppDomain.FirstChanceException Event; docs

  

提供在公共语言运行库开始搜索事件处理程序之前首次发生托管异常时引发的通知事件的数据。


要“通知”所有异常的另一种全局方法是使用Vectored Exception Handling。但这似乎只是不受管理的。

参考:Is it possible to do Vectored Strctured exception handling in c#?