谁应该捕获异常,呼叫者或被呼叫者

时间:2014-07-14 01:17:53

标签: c#

我目前正在研究代表,并从codeproject 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方法中添加了catch / Main,因为GetDelegate中的异常没有做任何事情。我的意思是,如果我单步执行我的代码,他们会被抓住,但程序仍然崩溃!!

  2. 如果我继续编译,我输入一个字母而不是数字会出现两个错误。我只期待FormatException,但我得到FormatExceptionNullReferenceException

    我认为这是调用方法,但它不是

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

1 个答案:

答案 0 :(得分:5)

此代码:

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

return Del;

导致你的问题。在实际处理错误之前,您正在捕获错误。当你发现异常时,你会说"现在处理这个错误,继续好像没有发生任何事情"。

因此,如果在上面的代码中捕获到错误,则打印错误消息,然后返回仍为null的委托 - 这将导致稍后出现其他错误。

由于你无法有意义地处理此级别的异常,所以你不应该在那里抓住它。