有没有更好的方法来处理强制转换异常

本文关键字:转换 异常 处理 更好 方法 有没有 | 更新日期: 2023-09-27 17:56:03

考虑以下函数:

public enum Operator
{
    EQUAL = 1,
    GREATER_THAN = 2
}
public class checkString
{
    public static bool isValid(string inputString, string checkString, Operator operation)
    {
        switch (operation)
        {
            case Operator.EQUAL:
                if (inputString == checkString)
                    return true;
                break;
            case Operator.GREATER_THAN:
                // Numeric check for greater than
                try
                {
                    double inputDouble, checkDouble;
                    inputDouble = Convert.ToDouble(inputString);
                    checkDouble = Convert.ToDouble(checkString);
                    if (inputDouble > checkDouble)
                        return true;
                }
                catch (Exception) 
                { }
                // Date check for greater than
                try
                {
                    DateTime inputDate, checkDate;
                    inputDate = DateTime.Parse(inputString);
                    checkDate = DateTime.Parse(inputString);
                    if (inputDate. > checkDate)
                        return true;
                }
                catch (Exception)
                { }
                break;
        }
        return false;
    }
}

参数

  • inputString:我们想要评估的内容
  • checkString:输入必须根据其计算的条件(值)
  • 运算符:我们要执行的操作的枚举

其他须知事项

  • 根据此方法计算文件中的每一行,以便在满足条件时返回
  • 评估文件中记录的过程逐行检查,在一个实例中,它等于条件。 它还可以检查同一行是否也大于条件。 检查完成后,它将移动到下一条记录
  • 除了任何默认值之外,没有其他事件侦听器挂接,我没有将额外的数据推送到调试或跟踪日志

问题

在这个

过程中的任何时候,我都不知道人们将要评估什么,但我需要能够检查"某物"(无论什么)是否等于、大于或小于其他事物。 当然,我检查了其他内容,但是我已经大大简化了此功能。

也就是说,使用 EQUAL 或 NOT_EQUAL 可以尽可能快地运行,根据上述标准非常快速有效地处理非常大的文件中的记录。 一旦我添加了GREATER_THAN逻辑,它的速度很慢...处理 20 个 Meg 文件需要几分钟,而过去需要半分钟

据我所知:

  • 到处抛出异常。 不能保证字段将是数字或日期类型。 所以我必须尝试转换为这些数据类型以尝试评估条件
  • 当抛出异常时,控制台会在我没有指示它这样做的地方获得输出,它的自动化

是的,我在这方面缺乏经验,并希望了解有关异常处理以及幕后真正发生的事情的更多信息,因为当其他 80% 的记录不是数字时,在 20 meg、80,000 记录文件中有很多异常。

有没有更好的方法来处理铸件本身以提高效率? 我见过双倍。解析/尝试解析,可以直接在前面投射,但不确定哪个好处最大。

有没有更好的方法来处理强制转换异常

使用双精度。TryParse 和 DateTime.TryParse 分别而不是 Convert.ToDouble 和 DateTime.Parse。

例:

double result;
if (double.TryParse(someString, out result))
{
    Console.WriteLine(result);
}
else
{
    // not a valid double
}

您可以在这些数据类型上使用 TryParse()。例外是混乱和昂贵的。TryParse 将返回 true/false 如果它是否有效,同时不抛出异常。因此,您只需检查通话结果即可。比例外更有效率。

Convert.ToDouble() 和 Double.Parse() 将抛出异常。

试试这段代码。它不是最好的,但它比你现在拥有的要好,考虑到你不知道类型可能是什么:

public static bool isValid(string inputString, string checkString, Operator operation)     
        {         
            double dblTmp1;
            double dblTmp2;
            if (Double.TryParse(inputString, out dblTmp1) && double.TryParse(checkString, out dblTmp2))
            {
                return Compare<Double>(dblTmp1, dblTmp1, operation);
            }
            DateTime dtTmp1;
            DateTime dtTmp2;
            if (DateTime.TryParse(inputString, out dtTmp1) && DateTime.TryParse(checkString, out dtTmp2))
            {
                return Compare<DateTime>(dtTmp1, dtTmp2, operation);
            }
            throw new InvalidOperationException("Unknown type");
        }
        public static bool Compare<T>(T obj1, T obj2, Operator operation) where T : IComparable      
        {
            switch (operation)
            {
                case Operator.EQUAL:
                    {
                        return obj1.Equals(obj2);
                    }
                case Operator.GREATER_THAN:
                    {
                        return obj1.CompareTo(obj2) > 0;
                    }
                default:
                    {
                        throw new InvalidOperationException("Unknown operation");
                    }
            }
        }

请记住,使用异常会减慢程序的速度,因为在后台运行时正在创建一个异常堆栈,以便在引发异常时能够展开它。无论您的程序是否抛出,都会维护此堆栈,而这种开销是最减慢您的速度。

在这种情况下,

其他答案可能是最佳解决方案,但在一般情况下,您可以通过捕获特定异常来改进解决方案,该异常可能是NumberFormatExceptionClassCastException。捕获Exception可能会导致各种烦人的、难以跟踪的问题(因为您没有记录异常)。