Обработка ошибок: try-catch или возврат кода ошибки? - PullRequest
3 голосов
/ 30 марта 2020

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

Давайте рассмотрим, как я вызываю функцию "foo (0)":

// Code 1
int foo(int a)
{
    int value = 10;
    return value/a;
}

Это приведет к исключению "деление на ноль".

Но если параметр "a" должен находиться внутри указанного диапазона c, чтобы функция "bar" (Код 2) могла возвращать действительный результат (например, в диапазоне [5 ... 10]), вызов его со значением вне этого диапазона (например, 3), конечно, не вызовет исключения, если я не определю его. Так что для этой ситуации я определяю исключение, не так ли?

Например, таким образом:

// Code 2
void bar(int b)
{
    if (b < 5)
    {
        throw new ArgumentException("Your input parameter is below minimum acceptable value");
    }
    else if (b > 10)
    {
        throw new ArgumentException("Your input parameter is above maximum acceptable value");
    }
    else
    {
        output(b);
    }
}

или для этого не следует использовать исключения (ну, я думаю, они здесь именно для этой цели) и я бы предпочел сделать это таким образом?

// Code 3
int bar(int b)
{
    int error = 0

    if (b < 5)
    {
        error = -1;
    }
    else if (b > 10)
    {
        error = -2;
    }
    else
    {
        output(b);
    }

    return error;
}

Спасибо за ваш ввод (ы).

Приветствия

(причина, почему я спрашиваю потому что у меня есть исходный код выпущенного программного обеспечения передо мной, у которого есть и то и другое. У меня нет большого опыта в OOP, следовательно, ни в «try-catch». Я прошел, это topi c очень неправильно понято. И я предполагаю, что разработчик программного обеспечения передо мной действительно неправильно понял. Скажите мне, если я не прав.)

Ответы [ 3 ]

2 голосов
/ 30 марта 2020

Идиоматический c способ сообщить об ошибке в C# - через исключение. Возвращение кодов ошибок может, конечно, технически работать, но это просто не так, как в C#.

1 голос
/ 30 марта 2020

Почему не коды ошибок (int bar(int b) {...}), а исключения ? Две основные причины:

  1. Вы можете легко и непреднамеренно ingore вернуть код ошибки; отладка может показаться болезненной. В случае возникновения исключения вы сразу узнаете об этом (рутина cra sh)
  2. Код ошибки, такой как 3, -14 et c. предоставляет очень небольшую информацию о том, что происходит; исключения могут многое рассказать о причине: по крайней мере исключение тип (в чем проблема; здесь у нас ArgumentOutOfRangeException - аргумент метода вне диапазона), сообщение (описание проблемы) и трассировка стека (где проблема)

Я предлагаю немного другой код:

void bar(int b)
{
    // Validation

    if (b < 5)
        //DONE: not just ArgumentException, but ArgumentOutOfRangeException
        //DONE: nameof(b) - which argument has wrong value (useful if you have several arguments) 
        //DONE: when complaining for below/above I suggest developer to know the boundaries 
        throw new ArgumentOutOfRangeException(
            nameof(b), 
          $"Your input parameter b = {b} is below minimum acceptable value {5}");
    else if (b > 10)
        throw new ArgumentOutOfRangeException(
            nameof(b), 
          $"Your input parameter b = {b} is above maximum acceptable value {10}");

    // Argument(s) is / are valid, main routine here

    output(b);
}
1 голос
/ 30 марта 2020

Ошибки должны быть возвращены путем выдачи ошибки с соответствующим типом (imo). Это позволяет вызывающей стороне получать уведомления и обрабатывать исключение явно.

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

...