Добавить дополнительную информацию в исключения - PullRequest
0 голосов
/ 22 октября 2010

Предположим, у меня есть метод, который читает клиентов из файла CSV.

При чтении файла возникает исключение (например, IOException или FormatException). В большинстве случаев метод не может ничего сделать с ошибками, но он может добавить дополнительную информацию, такую ​​как имя файла, номер строки и т. Д.

Класс метода получил зависимость IProgressAndErrorReporter, которая используется для регистрации / отображения ошибки.

Как мне сообщить вызывающему абоненту, что произошла ошибка, но что она уже устранена?

В настоящее время я делаю это так:

class CustomerReader
{
    private readonly IProgressAndErrorReporter mProgressAndErrorReporter;

    public bool TryReadCustomers() {
        try {
            ...
            return true;
        }
        catch (IOException err) {
            mProgressAndErrorReporter.ReportError(err, "Can't read file {0} bla bla");
            return false;
         }
    }
 }

(я ловлю только «ожидаемые» исключения, т.е. не InvalidOperation и т. Д.)
Я отлично работаю, но в типе приложений обработки данных, которые я обычно работаю с уровнем выше, выглядит так:

public bool TryProcessData() {
    if (!customerReader.TryReadCustomers())
        return false;

    var orders = webOrderReader.ReadNewOrders());
    if (orders == null)
        return false;

    if (!orderCreator.TryCreateNewOrder(order))
    ...

}

Для меня это похоже на возвращение ко времени до исключений.

Должен ли я вместо этого выбросить какое-то "AlreadyHandledException" с пустым предложением catch на верхнем уровне?

1 Ответ

1 голос
/ 02 мая 2011

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

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

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

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

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