попытка C++ ловит методы

Эта продуманная хорошая практика программирования в C++:

try {
// some code

}
catch(someException) {
// do something
}
catch (...) 
{

// left empty   <-- Good Practice???
} 
14
задан jschmier 3 June 2010 в 18:54
поделиться

9 ответов

Нет! Это ужасная практика!

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

Если вы перехватываете (...), вы совершенно не знаете, какое исключение было брошено, и поэтому не можете знать, безопасно ли продолжать выполнение.

45
ответ дан 1 December 2019 в 05:49
поделиться

хорошая практика:

try {
// some code

}
catch( const someException & e) {
// do something
}

Потому что вы знаете, какие исключения вы хотите перехватить.

catch (...) должен быть только в вашей main () и в точке входа потоков (ни одно исключение не должно покидать потоки), конечно, после перехвата (const std :: exception & e).

10
ответ дан 1 December 2019 в 05:49
поделиться

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

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

Итог, если вы не можете определить последствия отлова - не ловите.

2
ответ дан 1 December 2019 в 05:49
поделиться

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

Başak Bilgi

0
ответ дан 1 December 2019 в 05:49
поделиться

Обработка исключений - плохая идея.

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

4
ответ дан 1 December 2019 в 05:49
поделиться

Это один из тех вопросов, которые зависят от обстоятельств. Если вы имеете дело с плохо документированной сторонней библиотекой, которая определила собственное исключение, которое не наследуется от std :: exception, у вас может не быть другого выбора. Опять же, я бы оставил это только в отладочной части моего кода.

2
ответ дан 1 December 2019 в 05:49
поделиться

Нет. Это не очень хорошая практика программирования на C ++ или на любом другом языке.

Тихие неудачи - это плохо, и они рано или поздно укусят вас.

Если вы собираетесь поймать (...) , по крайней мере вы должны записать, что вы это делаете. Вам также может потребоваться удалить некоторые объекты, если вы не используете RAII.

7
ответ дан 1 December 2019 в 05:49
поделиться

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

Edit: как отметил Ноа Робертс, единственным случаем, когда это может быть разумной идеей, является деструктор. Важно подавлять исключения в деструкторах, иначе у вас может быть несколько активных исключений. Это может произойти, например, если брошено исключение, и в результате разворачивания стека вызывается деструктор. Если этот деструктор выбросит исключение, у вас будет два активных исключения. Тогда C++ вызовет std::terminate(), что по умолчанию приведет к завершению вашей программы. Вы можете установить обработчик для этого условия, но, вероятно, вы мало что сможете сделать, кроме как записывать происходящее в журнал.

Тем не менее, даже в деструкторе вы, вероятно, должны записать что-нибудь в журнал внутри catch (...). Однако, в зависимости от того, какой это деструктор, вам может быть недоступно средство протоколирования. Но в большинстве случаев вы все равно можете использовать std::cerr.

7
ответ дан 1 December 2019 в 05:49
поделиться

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

Тем не менее, утверждение там или что-то в этом роде было бы оправданным.

Конечно, другие упоминали темы. Я просто не занимаюсь машинным обучением, поэтому не знаю, в чем тут проблема.

4
ответ дан 1 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: