Rol*_*ana 2 .net c# exception c#-6.0 .net-4.6
比较旧的错误处理方式和新的错误处理方式,通过使用异常过滤器,使用过滤器对我来说到底有什么好处,什么时候应该使用它?在什么情况下我可以很好地利用这个新功能?
我已经阅读了有关展开堆栈的信息,但仍然不明白我们无法以旧方式处理该问题的情况。请像我5岁一样解释一下。
try
{
Foo.DoSomethingThatMightFail(null);
}
catch (MyException ex) when (ex.Code == 42)
{
Console.WriteLine("Error 42 occurred");
}
Run Code Online (Sandbox Code Playgroud)
与
try
{
Foo.DoSomethingThatMightFail(null);
}
catch (MyException ex)
{
if (ex.Code == 42)
Console.WriteLine("Error 42 occurred");
else
throw;
}
Run Code Online (Sandbox Code Playgroud)
我知道这个问题还有其他版本,问题是,这个问题提到了我实际上找不到的好处,例如。
异常过滤器比捕获和重新抛出更可取,因为它们不会损害堆栈。如果异常后来导致堆栈被转储,您可以看到它最初来自哪里,而不仅仅是最后一次被重新抛出的位置。
经过一些测试后,我没有看到两者之间的区别,我仍然从重新抛出的地方看到异常。所以,或者信息没有得到确认,我不理解异常过滤器(这就是我问的原因),或者我做错了(如果我错了,也请纠正我)。
class specialException : Exception
{
public DateTime sentDateTime { get; } = DateTime.Now;
public int code { get; } = 0;
public string emailsToAlert { get; } = "email@domain.com";
}
Run Code Online (Sandbox Code Playgroud)
然后:
try
{
throw new specialException();
//throw new Exception("Weird exception");
//int a = Int32.Parse("fail");
}
catch (specialException e) when(e.code == 0)
{
WriteLine("E.code 0");
throw;
//throw e;
}
catch (FormatException e)
{
if (cond1)
{
WriteLine("cond1 " + e.GetBaseException().Message+" - "+e.StackTrace);
throw;
}
throw;
}
catch (Exception e) //when (cond2)
{
Console.WriteLine("cond2! " + e.Message);
throw;
}
Run Code Online (Sandbox Code Playgroud)
我不明白保罗的回答。他可能是对的,也可能不是。
我绝对不同意亚历山大的回答。它不仅仅是语法糖。纯粹的语法糖意味着它只是一种更简单的编写方式,并且执行不会改变。
然而,在这种情况下情况并非如此。正如 Thomas Levesque在他的博客中指出的那样,异常过滤器不会展开堆栈。因此,在调试程序时,如果 try 块中抛出异常,则使用异常过滤器,您将能够看到 try 块中值的状态。如果您没有使用异常过滤器,您的代码将进入 catch 块,并且您将丢失有关 try 块中变量状态的信息。
请注意,我不是在谈论堆栈跟踪(它是与堆栈不同但相关的概念)。除非您明确地重新抛出异常,否则堆栈跟踪将保持不变,就像在throw exception;catch 块中(其中exception捕获的异常)一样。
因此,虽然在某些情况下,您可以将其视为可能会或可能不会使您的代码更清晰的东西(取决于您对语法的看法),但它确实会改变行为。
| 归档时间: |
|
| 查看次数: |
1824 次 |
| 最近记录: |