我正在为用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
任何帮助将不胜感激,谢谢!
答案 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#?