我正在处理此程序中的异常,这是处理异常的正确方法。
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来计算函数。
我可以进行任何更改,以使该程序更有效。
答案 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
用于捕获异常,而不是抛出异常。