小编Rol*_*ana的帖子

使用异常过滤器有什么好处以及何时应该使用它们?

比较旧的错误处理方式和新的错误处理方式,通过使用异常过滤器,使用过滤器对我来说到底有什么好处,什么时候应该使用它?在什么情况下我可以很好地利用这个新功能?

我已经阅读了有关展开堆栈的信息,但仍然不明白我们无法以旧方式处理该问题的情况。请像我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 …
Run Code Online (Sandbox Code Playgroud)

.net c# exception c#-6.0 .net-4.6

2
推荐指数
1
解决办法
1824
查看次数

为什么异常过滤器比捕获和重新抛出更可取?

基于这个问题(新Exception filter功能提供了哪些好处?).

该声明:

异常过滤器比捕获和重新抛出更可取,因为它们可以保持堆栈不受破坏.如果稍后的异常导致堆栈被转储,您可以看到它最初来自哪里,而不仅仅是它重新抛出的最后一个位置.

做一些测试后,我没有看到这两个之间的区别,新与旧,我还看到有人的地方例外重新抛出.所以,或者信息未被确认,我不理解异常过滤器(这就是我要问的原因),或者我做错了.你能解释一下为什么这个动作过滤器有优势吗?

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(); //line 16
            throw new Exception("Weird exception");
            //int a = Int32.Parse("fail");
        }
        catch (specialException e) when(e.code == 0)
        {
            WriteLine("E.code 0");
            throw; // <-Line 23
        }
        catch (FormatException e) 
        {
                WriteLine("cond1 " + e.GetBaseException().Message+" …
Run Code Online (Sandbox Code Playgroud)

.net c# error-handling exception .net-4.6

1
推荐指数
1
解决办法
248
查看次数

标签 统计

.net ×2

.net-4.6 ×2

c# ×2

exception ×2

c#-6.0 ×1

error-handling ×1