If-condition vs обработчик исключений - программирование
Подтвердить что ты не робот

If-condition vs обработчик исключений

У меня возник вопрос:

"Что вы предпочитаете, обработка исключений или if-condition?"

для интервью. Мой ответ заключался в том, что обработчики исключений предпочтительнее только для исключительных ситуаций, таких как ошибка разрешения диска при записи файла. Интервьюер, казалось, ожидал другого ответа. Каков правильный ответ?

EDIT: Любой конкретный пример, когда обработка исключений обычно используется, когда условие if было бы более подходящим?

4b9b3361

Ответ 1

Поскольку этот вопрос отмечен как "С#", мы можем ссылаться на Руководство по разработке .NET Framework как хорошую отправную точку для ответа на эти типы вопросов. Это руководство, приведенное в MSDN под "Бросок исключений" :

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

Вот пример практики bad, где обрабатывается исключение, но почти всегда можно избежать:

public int? GetItem(int index)
{
    int? value = null;
    try
    {
        value = this.array[index];
    }
    catch (IndexOutOfRangeException)
    {
    }

    return value;
}

Это кажется надуманным, но я часто вижу такой код от более новых программистов. Предполагая правильную синхронизацию при чтении и записи на array, это исключение можно устранить на 100%. Учитывая, что лучший способ написать этот код будет следующим:

public int? GetItem(int index)
{
    int? value = null;

    // Ensure the index is within range in the first place!
    if (index >= 0 && index < this.array.Length)
    {
        value = this.array[index];
    }

    return value;
}

Существуют и другие случаи, когда вы не можете разумно избегать исключений и просто должны их обрабатывать. Это чаще всего встречается, когда вам приходится иметь дело с внешними ресурсами, такими как файлы или сетевые соединения, с которыми вы могли бы в любой момент потерять доступ или связаться с ними. Пример из WCF:

public void Close()
{
    // Attempt to avoid exception by doing initial state check
    if (this.channel.State == CommunicationState.Opened)
    {
        try
        {
            // Now we must do a (potentially) remote call;
            // this could always throw.
            this.channel.Close();
        }
        catch (CommunicationException)
        {
        }
        catch (TimeoutException)
        {
        }
    }

    // If Close failed, we might need to do final cleanup here.
    if (this.channel.State == CommunicationState.Faulted)
    {
        // local cleanup -- never throws (aside from catastrophic situations)
        this.channel.Abort();
    }
}

Даже в приведенном выше примере хорошо проверить, что операция, которую вы собираетесь делать, по крайней мере, имеет шанс преуспеть. Таким образом, по-прежнему существует проверка if (), за которой следует соответствующая логика обработки исключений.

Ответ 2

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

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

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

Edit

Общей плохой практикой, которую я видел в некоторых местах, является это

 try
 {
     string str = "Some String"
     int i = Convert.ToInt32(str);
 }
 catch (Exception ex)
 {
      MessageBox.Show("Invalid input");          
 }

Теперь попробуйте поймать, можно легко избежать в этом корпусе, используя if else

  string str = "Some String"
  int i;
    if(!int.TryParse(str, out i))
    {
       MessageBox.Show("Invalid input");          
    }

Ответ 3

Правильный ответ - это тот, который вы дали.

Для большей специфики вы должны были что-то сказать о влиянии "я использую инструкции if, где это возможно, из-за накладных расходов на улов и исключения".

Ответ 4

Обычно я предпочитаю использовать какое-то специальное значение undefined (например, null для объектов), чтобы указать, что некоторые вычисления не могут привести к допустимому результату из-за недопустимого ввода. Это означает, что мой код может успешно определить и сообщить, что входные данные недействительны, и никакого значимого результата не может быть получено.

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

Итак, концептуально:

  • Undefined result (плюс if-condition): программа успешно определяет, что для данного ввода нет допустимого вывода.
  • Исключение (плюс try-catch): программа не может завершить вычисление из-за некоторой ошибки в приложении, не связанной с вводом.

Ответ 5

Если вы знаете точный логин программы и знаете ошибки, которые могут возникнуть, тогда вы можете написать инструкцию if-else или в другом случае вы можете оставить вещи, чтобы попытаться обработать исключение исключения.