Любое значение при перехвате исключения и немедленном его повторении?

Возможный дубликат:
Имеет ли какое-либо исключение только рейз?

Есть ли какое-либо значение для повторного воссоздания исключения без другого кода между ними?

try: #code except Exception: raise 

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

8 Solutions collect form web for “Любое значение при перехвате исключения и немедленном его повторении?”

Ранее я видел аналогичный код в (наборе) ужасных проектов VB.NET. Либо намерение заключалось в том, чтобы ловить и регистрировать исключения, даже не возвращаясь, чтобы закончить регистрацию, или они услышали «вы должны поймать исключения», реализовали эту функциональность, а кто-то решил, что он должен просто повторно рейзить.

Для вышеуказанного кода нет никакой пользы.

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

Это позволяет избежать повторного отбрасывания кода, когда вы захотите включить блоки «try .. except ..» позже.

Пример построен на этом вопросе . Если в блоке try есть другие, except «s», его можно использовать для фильтрации исключений, но только это бессмысленно.

 class FruitException(Exception): pass try: raise FruitException except FruitException: print "we got a bad fruit" raise except Exception: print "not fruit related, irrelevant." 

Да, это, как правило, плохая практика. Единственное (несколько) правильное использование, которое я видел в этом шаблоне, было до того, как у VB.NET была доступная конструкция. Использование выглядело примерно так:

 Dim myResource As DisposableService Try myResource = New DisposableService() ' This might throw an exception.... myResource.DoSomething() Catch Throw Finally ' Perform cleanup on resource If Not myResource Is Nothing Then myResource.Dispose() End If End Try 

Кроме этого, я действительно не могу придумать хороший пример использования такого рода вещей.

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

это было в декораторе, который обертывает func: так что в основном то, что я хотел, – это повторно поднять ошибку, которую я уловил, когда я вызвал функцию func, чтобы декоратор не изменял поведение функции func, потому что когда func исключение исключает отправку в графический интерфейс, чтобы сообщение об ошибке могло появиться пользователю,

и для попытки, за исключением того, что я использую его, потому что я хочу выполнить код, наконец, даже если возникает исключение

 try: result = func(self, *args, **kws) return result except Exception, ex: # If an exception is raised save it also. logging_data['message'] = str(ex) logging_data['type'] = 'exception' # Raise the error catched here so that we could have # the same behavior as the decorated method. raise finally: # Save logging data in the database .... 

надеюсь, что это поможет понять использование ре-рейза

Как правило, в модели try-catch любое неперехваченное исключение автоматически будет выбрано (поднято?). Захват исключения только для повторного броска может быть в духе Allman стиле кодирования, но не выполняет никаких функциональных целей.

Представьте себе

 def something(a,b): try: // do stuff except SomethingSpecificToThisFunction: //handle except: //Everything else, should likely be handled somewhere else raise try: something("a","b") except e: Log(e) - def something(a,b): try: // do stuff except SomethingSpecificToThisFunction: //handle except: //Everything else, should likely be handled somewhere else raise try: something("a","b") except e: Log(e) 

Затем, опять же, поведение по умолчанию в любом случае, поэтому просто захотите оставить его

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

  • Повысить исключение против возврата Нет в функциях Python
  • Добавление информации в исключение?
  • Как обрабатывать различные исключения, возникающие в разных версиях Python
  • traceback.print_exc () вопрос python
  • Исключение Django - catch
  • Обработка произвольного исключения, печать сообщения об исключении по умолчанию
  • Python, отличающий пользовательские исключения
  • Повторно назначить исключение из блока python __exit__
  • try / else с возвратом в блоке try
  • возвращаемое значение обработки исключительных исключений
  • Что такое хороший способ обработки исключений при попытке прочитать файл в python?
  • Python - лучший язык программирования в мире.