实际上FirstChanceException
是一个“简单”的全局异常过滤器的事实让我走上了正轨(它是否是“正确的”轨道还有待观察):
我们已经在 CLI 中有异常过滤器。
如果一个人有幸在 C# 6 中工作,那么它很简单:
try
{
throw new NullReferenceException("No, Really");
}
catch(Exception ex) when (FilterExType(ex))
{
Console.WriteLine($"2: Caught 'any' exception: {ex}");
}
static bool FilterExType(Exception ex)
{
if (ex is NullReferenceException)
{
Environment.FailFast("BOOM from C#!", ex);
}
// always handle if we return
return true;
}
对于我们这些(像我一样)坚持早期版本的人,我们可以通过委托/lambda通过VB.NET路由过滤:
try {
VbFilterLib.FilteredRunner.RunFiltered(() =>
{
throw new NullReferenceException("Via VB.NET");
});
}
catch (Exception ex)
{
Console.WriteLine("1: Caught 'any' exception: {0}", ex");
}
使用 VB(请耐心等待,VB.NET远非我精通的语言):
Public Class FilteredRunner
Delegate Sub VoidCode()
Private Shared Function FilterAction(x As Exception) As Boolean
If TypeOf x Is NullReferenceException Then
Environment.FailFast("Abort program! Investigate Bug via crash dump!", x)
End If
' Never handle here:'
Return False
End Function
Public Shared Sub RunFiltered(code As VoidCode)
Try
code.Invoke()
Catch ex As Exception When FilterAction(ex)
Throw New InvalidProgramException("Unreachable!", ex)
End Try
End Sub
End Class
显然,要使其工作,您需要更多的配置索具,但这似乎正是我想要的。:-)