【问题标题】:Try catch in c# for divide by zero error尝试c#中的catch除以零错误
【发布时间】:2011-11-11 12:21:29
【问题描述】:

如何在 C# 中执行 try catch,以便我在 try catch 中执行 sql 查询

有时count的值为0,它会抛出一个错误除以零错误。 因此,当它抛出除以零错误时,我必须执行一条 sql 语句来删除该语句,并且循环必须继续获取下一条记录的值。我该怎么做。

double value = (read * 100 / count);

【问题讨论】:

  • 你能显示更多关于 sql 语句的代码吗?
  • 当您的计算结果是int 时,为什么valuedouble
  • catch(DivideByZeroException ex),但正如许多其他写的那样,没有理由使用 try catch... 使用 if 代替

标签: c# error-handling


【解决方案1】:

当您可以简单地测试 count 的值是否等于 0 时,为什么还要进行 try/catch:

if (count != 0)
{ 
    // perform the division only if count is different than 0,
    // otherwise we know that it will throw an exception 
    // so why even attempting it?
    double value = (read * 100 / count);
}

【讨论】:

  • 当然,事实上处理异常是徒劳的,根据thisthis,不会引发任何异常。所以,这是要走的路。
  • if (count > 0) 会更好,负数(即使失败,或者misstype)不是有效状态
【解决方案2】:

这是条件逻辑,不应由异常处理。在操作前检查count的值,并相应地执行sql语句。

【讨论】:

    【解决方案3】:

    你可以这样试试..

    这是示例

    namespace nsDivZero
    {
        using System;
        public class DivZero
        {
            static public void Main ()
            {
                // Set an integer equal to 0
                int IntVal1 = 0;
                // and another not equal to zero
                int IntVal2 = 57;
                try
                {
                    Console.WriteLine ("{0} / {1} = {2}", IntVal2, IntVal1, IntResult (IntVal2, IntVal1) / IntResult (IntVal2, IntVal1));
                }
                catch (DivideByZeroException e)
                {
                    Console.WriteLine (e.Message);
                }
                // Set a double equal to 0
                double dVal1 = 0.0;
                double dVal2 = 57.3;
                try
                {
                    Console.WriteLine ("{0} / {1} = {2}", dVal2, dVal1, DoubleResult (dVal2, dVal1));
                }
                catch (DivideByZeroException e)
                {
                    Console.WriteLine (e.Message);
                }
            }
            static public int IntResult (int num, int denom)
            {
                return (num / denom);
            }
            static public double DoubleResult (double num, double denom)
            {
                return (num / denom);
            }
        }
    }
    

    【讨论】:

    • +1 :不是最好的答案,而是实际展示如何尝试/捕捉问题。
    【解决方案4】:

    在这种情况下,与其使用try catch,不如检查计数是否为0。类似于

    if (count == 0)
    {
        DeleteStatement();
        continue;
    }
    
    double value = (read * 100 / count);
    

    【讨论】:

      【解决方案5】:

      比起使用 if 语句或 try/catch 语句,我更喜欢将 double.Epsilon 添加到分隔符中。如果使用浮点数,您也可以使用float.Epsilon。它代表大于零的最小可能数字,它不会真正影响您的结果。我在生成报告和图表时使用它

      double value = (read * 100 / (count + double.Epsilon));

      【讨论】:

      • public string OpenRate => $"{Read / (Sent + double.Epsilon):P}" 是使用现代 c# 表达式主体成员执行此操作的一种简单方法(可以轻松地将 P0 用于 45% 或 P1 用于 25.2% 等)
      【解决方案6】:

      这种类型的异常在 Java 中称为 RuntimeException(我知道这是 C#),这意味着它应该首先被阻止,而不是被捕获。只需测试计数不为 0。

      【讨论】:

      • double 不会在 C# 中引发异常,根据this,浮点运算符都不会。
      • 好的,但我是说要阻止它。我与 Java 进行了类比,以表明它们区分受检异常和运行时异常,以表明后者应该被阻止,而不是被捕获。
      • 是的,更是如此,如果不会引发异常的话。
      【解决方案7】:

      if (count > 0)//as suggested by sasjaq { double value = (read * 100 / count); }

      似乎是一个很好的方法。使用 try catch 可能会显着降低性能......

      【讨论】:

        【解决方案8】:

        如果你传递的值是 0 并且你正在对其进行除法,你可以通过执行以下操作来绕过它:

        int x = 0; 
        
        int z = 1300; 
        

        如果除以 0,您将传递无穷大值,否则您将根据除法传递所需的正确数量!

        int result = x == 0 ? 99999 : x / z; 
        
        Console.WriteLine(result);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-18
          • 1970-01-01
          • 2021-08-03
          • 2011-06-12
          • 2022-06-16
          • 2013-07-02
          相关资源
          最近更新 更多