Как я должен "перебросить" исключение, то есть предположим:
- Я пытаюсь что-то в своем коде, и, к сожалению, он терпит неудачу.
- Я пробую какое-то "умное" обходное решение, которое также не срабатывает на этот раз.
Если я выброшу исключение из (обходного) обходного пути, он будет довольно запутанным для пользователя, поэтому я думаю, что лучше всего восстановить исходное исключение (?), с описательной трассировкой, с которой он приходит ( о реальной проблеме)...
Примечание: мотивирующим примером этого является вызов np.log(np.array(['1'], dtype=object))
, где он пытается остроумный обходной путь и дает AttributeError
(это действительно" a TypeError
).
Один из способов, о котором я могу думать, - это просто повторить вызов оскорбительной функции, но это кажется упрямым (теоретически исходная функция может проявлять другое поведение во второй раз, когда она называлась):
Хорошо, это один ужасный пример, но здесь идет...
def f():
raise Exception("sparrow")
def g():
raise Exception("coconut")
def a():
f()
Предположим, что я сделал это:
try:
a()
except:
# attempt witty workaround
g()
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-4-c76b7509b315> in <module>()
3 except:
4 # attempt witty workaround
----> 5 g()
6
<ipython-input-2-e641f2f9a7dc> in g()
4
5 def g():
----> 6 raise Exception("coconut")
7
8
Exception: coconut
Ну, проблема на самом деле не связана с кокосовым орехом, но воробей:
try:
a()
except:
# attempt witty workaround
try:
g()
except:
# workaround failed, I want to rethrow the exception from calling a()
a() # ideally don't want to call a() again
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-4-e641f2f9a7dc> in <module>()
19 except:
20 # workaround failed, I want to rethrow the exception from calling a()
---> 21 a() # ideally don't want to call a() again
<ipython-input-3-e641f2f9a7dc> in a()
8
9 def a():
---> 10 f()
11
12
<ipython-input-1-e641f2f9a7dc> in f()
1 def f():
----> 2 raise Exception("sparrow")
3
4
5 def g():
Exception: sparrow
Есть ли стандартный способ справиться с этим, или я думаю об этом совершенно неправильно?