7

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

try: 
    result = third_party.fast_calculation() 
catch: 
    result = slower_calculation() 

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

Как мне написать статью catch в этой ситуации?

ответ

1

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

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

0

Прежде всего, убедитесь, что ваш сторонний код действительно генерирует исключения. Это не так.

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