Есть ли лучший способ обработать исключение броска? - PullRequest
8 голосов
/ 12 мая 2011

Рассмотрим следующую функцию:

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: критерий (значение), с которым входные данные должны оцениваться по
  • Оператор: Enum для операции, которую мы хотим выполнить

Другие вещи, которые нужно знать

  • Каждая строка в файле сравнивается с этим методом для возврата, если условие было выполнено
  • Процесс оценки записей в файле проверяется построчно, в одном случае это соответствует условию. Он также может проверить, что та же строка также больше, чем условие. Как только проверки завершены, он переходит к следующей записи
  • Нет дополнительных прослушивателей событий, кроме тех, которые установлены по умолчанию, я не загружаю дополнительные данные в журналы отладки или трассировки

Задача

То, что люди собираются оценивать, неизвестно мне в любой момент этого процесса, но мне нужно иметь возможность проверить, что «что-то» (независимо от того, что) равно, больше или меньше чего-то другого. Конечно, я проверяю другие вещи, но я значительно упростил эту функцию.

Тем не менее, использование EQUAL или NOT_EQUAL выполняется как можно быстрее, обрабатывая записи в очень большом файле в соответствии с указанными критериями довольно быстро и эффективно. Как только я добавил логику GREATER_THAN, она стала медленной ... до такой степени, что для обработки 20 мегабайтных файлов, которые раньше занимали полминутные вершины, требуются минуты.

Из того, что я могу сказать:

  • Исключения выбрасываются повсюду. Нет гарантии, что поле будет числовым или типа даты. Поэтому я должен попытаться привести к этим типам данных, чтобы попытаться оценить условие
  • Когда генерируются исключения, консоль получает вывод там, где я не дал указание сделать это, своего рода автоматизированный

Да, у меня нет опыта в этой области, и я хочу узнать больше об обработке исключений и о том, что на самом деле происходит за кулисами, потому что, когда остальные 80% записей не являются числовыми, это много исключений в 20. мег, 80 тыс. файлов записи.

Есть ли лучший способ обработать сам актерский состав для повышения эффективности? Я видел double.Parse / TryParse и умеет направлять перед собой, но не уверен, что принесет больше пользы.

Ответы [ 4 ]

11 голосов
/ 12 мая 2011

Используйте double.TryParse и DateTime.TryParse вместо Convert.ToDouble и DateTime.Parse соответственно.

Пример:

double result;

if (double.TryParse(someString, out result))
{
    Console.WriteLine(result);
}
else
{
    // not a valid double
}
8 голосов
/ 12 мая 2011

Вы можете использовать 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");
                    }
            }
        }
2 голосов
/ 12 мая 2011

Имейте в виду, что использование исключений замедляет вашу программу, поскольку за кулисами среда выполнения создает стек исключений, чтобы иметь возможность отмотать его в случае возникновения исключения. Этот стек поддерживается независимо от того, запускает ваша программа или нет, и именно эти издержки замедляют вас больше всего.

0 голосов
/ 12 мая 2011

Другие ответы, вероятно, являются лучшим решением в этом случае, но в общем случае вы можете улучшить свое решение, поймав конкретное исключение, которое, вероятно, NumberFormatException или ClassCastException.Поймать Exception может вызвать все виды раздражающих, трудно прослеживаемых проблем (так как вы не регистрируете исключение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...