gpt4 book ai didi

c# - 谁应该捕获异常,调用者还是被调用者

转载 作者:太空宇宙 更新时间:2023-11-03 20:04:23 24 4
gpt4 key购买 nike

我目前正在研究委托(delegate)并从代码项目中阅读此页面 6 important uses of Delegates and Events .我尝试在这个类中实现代码的逻辑。

class MathOp
{
public delegate int OperationsDelegate(int x, int y);
private OperationsDelegate Del;

public OperationsDelegate GetDelegate()
{
Console.WriteLine("\n\tEnter 1 for Addition\n\tEnter 2 for Subtraction\n\tEnter 3 for Multiplication\n\tEnter 4 for Division");
int input;
try
{
input = Convert.ToInt32(Console.ReadLine());
switch(input)
{
case 1:
Del = Add;
break;
case 2:
Del = Sub;
break;
case 3:
Del = Mul;
break;
case 4:
Del = Div;
break;
}


}
catch(FormatException error) { Console.WriteLine(error.Message); }
catch(OverflowException error) { Console.WriteLine(error.Message); }
catch(NullReferenceException error) { Console.WriteLine(error.Message); }

return Del;
}


private int Add(int a, int b) { return a + b; }
private int Sub(int a, int b) { return a - b; }
private int Mul(int a, int b) { return a * b; }
private int Div(int a, int b) { return a / b; }
}

然后我从 Main 方法中调用方法,例如:

 MathOp Cal = new MathOp();


try
{
int answer = Cal.GetDelegate().Invoke(2, 4);
Console.WriteLine(answer);
}
catch(FormatException er) { Console.WriteLine(er.Message); }
catch(NullReferenceException er) { Console.WriteLine(er.Message); }
  1. 我只添加了 try/catchMain方法,因为我在 GetDelegate 里面的异常没有做任何事情。我的意思是,如果我单步执行我的代码,它们就会被捕获,但程序仍然会崩溃!!

  2. 如果我继续编译它,我会收到两个输入字母而不是数字的错误。我只期待 FormatException ,但我同时得到 FormatExceptionNullReferenceException !

    我以为是invoke方法,其实不是

  3. 一般而言,除此代码外,我认为捕获异常的负担落在被调用方方法而不是调用方身上是否正确?!

最佳答案

这段代码:

catch(FormatException error) { Console.WriteLine(error.Message);  }
catch(OverflowException error) { Console.WriteLine(error.Message); }
catch(NullReferenceException error) { Console.WriteLine(error.Message); }

return Del;

导致您的问题。您在实际处理错误之前就发现了错误。当您捕捉到一个异常时,您是在说“这个错误现在已经被处理了,就当什么都没发生一样继续”。

因此,如果在上面的代码中发现错误,您将打印错误消息,然后返回仍然是 null 的委托(delegate) - 这会导致稍后出现另一个错误。

由于您无法有意义地处理此级别的异常,因此您不应该在那里捕获它。

关于c# - 谁应该捕获异常,调用者还是被调用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24728398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com