【发布时间】:2015-12-13 17:09:26
【问题描述】:
比较旧的错误处理方式和新的错误处理方式,通过使用异常过滤器,使用过滤器对我来说究竟有什么优势,我应该在什么时候使用它?有没有一种情况可以让我充分利用这项新功能?
我已经阅读了有关展开堆栈的信息,但我仍然没有得到我们无法以旧方式处理它的情况。请像我 5 岁一样解释一下。
try
{
Foo.DoSomethingThatMightFail(null);
}
catch (MyException ex) when (ex.Code == 42)
{
Console.WriteLine("Error 42 occurred");
}
对
try
{
Foo.DoSomethingThatMightFail(null);
}
catch (MyException ex)
{
if (ex.Code == 42)
Console.WriteLine("Error 42 occurred");
else
throw;
}
我知道这个问题还有其他版本,问题是,问题提到了我实际上找不到的好处。
异常过滤器比捕获和重新抛出更可取,因为 他们让堆栈安然无恙。如果后来异常导致堆栈 要被倾倒,你可以看到它最初来自哪里,而不是 只是它被重新抛出的最后一个地方。
在做了一些测试之后,我没有看到两者之间的区别,我仍然从它被重新抛出的地方看到异常。所以,或者信息没有得到确认,我不理解异常过滤器(这就是我问的原因),或者我做错了(如果我错了也请纠正我)。
class specialException : Exception
{
public DateTime sentDateTime { get; } = DateTime.Now;
public int code { get; } = 0;
public string emailsToAlert { get; } = "email@domain.com";
}
然后:
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;
}
【问题讨论】:
-
您在哪里找到“例外过滤器更可取...”这句话?
-
在他们说我重复的问题中。 (stackoverflow.com/questions/27082069/…)
-
Thomas Levesque 写得很好here。你读过它吗?他提出了一些很好的观点,因为我在脑海中交替使用堆栈和堆栈跟踪,他的帖子为我清除了这一点。
-
是的,非常详细,谢谢!我认为这回答了我的问题。
-
你可能想问他是否可以在这里复制他的答案,或者邀请他这样做。
标签: c# .net exception-handling c#-6.0 .net-4.6