c#try catch throw中的异常

时间:2017-09-03 01:25:19

标签: c#

我正在处理此程序中的异常,这是处理异常的正确方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assignment1
{
class Calc
{
    public static double n1;
    public static double n2;
    public static char op1;
    public static double result;

    public static void Calculate(String num1, String num2, String op)
    {

        op1 =Convert.ToChar(op);
        n1 = Convert.ToDouble(num1);
        n2 = Convert.ToDouble(num2);


            switch (op1)
            {
                case '+':
                    Console.WriteLine(Add());
                    break;

                case '-':
                    Console.WriteLine(Minus());
                    break;

                case '*':
                    Console.WriteLine(Multiply());
                    break;

                case '/':    //******exception handling*****//

                if (n2 == 0)
                {
                    try
                    {

                        throw new Exception("number 2 cannot be zero");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }



            Console.WriteLine(Divide());
                        break;


                case '^':
                    Console.WriteLine(Power());
                    break;

                default:    //******exception handling*****//
                try
                {

                    throw new Exception("Invalid Operator: Exception Handling");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                break;
            }

    }

    public static double Add()
    {
        Console.WriteLine("Addition");
        result = n1 + n2;
        return result;

    }

    public static double Minus()
    {
        Console.WriteLine("Subtraction");
        result = n1 - n2;
        return result;

    }

    public static double Multiply()
    {
        Console.WriteLine("Multiplication");
        result = n1 * n2;
        return result;

    }

    public static double Divide()
    {
        Console.WriteLine("Division");
        result = n1 / n2;
        return result;

    }
    public static double Power()
    {
        Console.WriteLine("X power of n");
        result = Math.Pow(n1, n2);
        return result;

    }
    }
    }

这里我不想在除法中使用除零除外,因为它不适用于双数据类型。

我还希望在用户输入无效运算符时获得异常。因此我在默认情况下使用了异常处理程序。

我在主函数中输入用户输入,然后将输入作为参数传递给main来计算函数。

我可以进行任何更改,以使该程序更有效。

2 个答案:

答案 0 :(得分:2)

没有您的代码确定。将异常仅用于在下一行捕获所有类型的异常,只是为了吃掉它,没有用处!

考虑你的代码:

try
{
    throw new Exception("Invalid Operator: Exception Handling");
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

这基本上与:

相同
Console.WriteLine("Invalid Operator: Exception Handling");

...除了在调试器中抛出第一次机会异常。

一般来说,你想做这样的事情

try
{
    var x = Divide (9, 3);
    x = Divide (14, 2.3f); 
    Divide(10, 0);  // bang!
}
catch (DivideByZeroException ex)
{
    Console.WriteLine(ex.Message);
}

.
.
.
float Divide (float n, float d)
{
    return n / d;
}

OP:

  

我可以进行任何更改,以使该程序更有效。

是。只针对“不寻常”或特殊(双关语)案件的事件抛出异常。 不要将异常用作指导流量控制的方法。虽然抛出异常在计算上是 cheap ,但在catch内部的转换并不会使它比特定场景中的简单if/else慢得多。

答案 1 :(得分:0)

n2 == 0的情况下,您不需要try catch块。如果您已经有if语句验证了n2的值,那么您首先要避免错误。基本上你有两个选择,要么使用if语句,要么使用try catch块。建议的方法是验证您的数据,依靠try catch块主要不是一个好的方法。 现在为您的选择

选项1:

public static void Calculate(String num1, String num2, String op)
{

   //Code

        switch (op1)
        {
          //Code
            case '/':    //******exception handling*****//

            if (n2 == 0)
            {
                Console.WriteLine("number 2 cannot be zero");
                break;
            }

            Console.WriteLine(Divide());
            break;

            default:    //******exception handling*****//
                Console.WriteLine("Invalid Operator: Exception Handling");
                break;
          }
}

选项2:

public static void Calculate(String num1, String num2, String op)
{

    //Code

        switch (op1)
        {
          //Code
            case '/':    //******exception handling*****//

            try{
                Divide(); //Whatever your dividing method is
            }
            catch (Exception ex){
                Console.WriteLine(ex.Message);
            }

            default:    //******exception handling*****//
                Console.WriteLine("Invalid Operator: Exception Handling");
                break;
          }
}

请记住,Try Catch用于捕获异常,而不是抛出异常。