在VB.NET中,我经常Catch…When
:
Try … Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES" … End Try
是否有C#相当于Catch…When
?
如果可能if
的catch
话,我不想诉诸于使用声明.
Catch…When
在C#中没有相同的东西.你真的不得不求助于if
你的内部声明catch
,然后重新抛出你的条件是否满足:
try { … } catch (ArgumentNullException e) { if ("SAMPLES" == e.ParamName.ToUpper()) { … // handle exception } else { throw; // condition not fulfilled, let someone else handle the exception } }
这个功能是为C#6宣布的.现在可以写了
try { … } catch (MyException e) when (myfilter(e)) { … }
您现在可以下载Visual Studio 2015的预览版以查看它,或者等待官方发布.
这不会重新创建与VB Catch When表达式相同的语义.有一个关键的区别.VB表达式在堆栈展开之前执行.如果要在过滤时检查堆栈,您实际上会看到抛出异常的帧.
在catch块中有一个if是不同的,因为catch块在解除堆栈后执行.这在错误报告方面尤为重要.在VB场景中,您可以使用包括故障在内的堆栈跟踪进行崩溃.在C#中无法获得该行为.
编辑:
写了一篇关于这个主题的详细博客文章.