Обработка исключений в определении метода или вызове? - PullRequest
0 голосов
/ 16 ноября 2011

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

Извините, но я ничего не смог найти по этому поводу (поиск в "области обработки исключений" не дал того, что я искал).* Пример:

// this way...
void readFile(string file)
{
    try
    {
        /* do my stuff */
    }
    catch(Exception exception)
    {
        /* handle exception */
    }
}

int main()
{
    readFile(file);
}

// or this way?
void readFile(string file)
{
    /* do my stuff */
}

int main()
{
    try
    {
        readFile(file);
    }
    catch(Exception exception)
    {
        /* handle exception */
    }
}

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 16 ноября 2011

Как правило, вы хотите обработать ошибку там, где это имеет смысл.

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

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

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

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

3 голосов
/ 16 ноября 2011

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

bool readFile(string file)
{
    try {
        /* do my stuff */
        return true;
    } catch(Exception exception) {
        /* handle exception */
        return false;
    }
}
1 голос
/ 16 ноября 2011

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

1 голос
/ 16 ноября 2011

Если вы можете обработать исключение, восстановить его и продолжить, то вы должны сделать это немедленно.

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

0 голосов
/ 16 ноября 2011

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

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