看這個:
RuntimeError: No active exception to reraise
我用raise. 沒有這樣的錯誤:
class example:
def __getattribute__(self, attr_name):
raise # I mean: AttributeError: '...' object has no attribute '...'
這是raise 宣告:
raise_stmt ::= "raise" [expression ["from" expression]]
運算式是可選的。
我檢查了這個,但這不是我的答案。如果錯誤顯示“沒有要重新提出的活動例外”,那么我可以激活一個錯誤。我不知道這個錯誤是什么意思。我的問題是,“活動例外”是什么意思以及它在哪里使用?它是否有助于使代碼更短、更優化?是否可以將它用于我在代碼中顯示的更高一點的任務?
uj5u.com熱心網友回復:
當你使用raise關鍵字幾乎沒有時,Python 會嘗試在當前范圍內重新引發當前發生的例外,如果沒有觸發例外,你會得到RuntimeError: No active exception to re-raise.
要查看哪個例外處于活動狀態(正在處理),您可以使用sys.exc_info():
import sys
try:
raise ZeroDivisionError()
except ZeroDivisionError:
type_, value, tb = sys.exc_info()
print(type_) # <class 'ZeroDivisionError'>
在上面的 except 塊中,您可以使用裸raise關鍵字,它ZeroDivisionError為您重新引發了例外。
如果沒有激活的例外,回傳的值sys.exc_info()就是(None, None, None)。所以你必須使用raise關鍵字后跟一個子類或BaseException的實體。__getattribute__由于沒有活動例外,因此在您的方法內問題中就是這種情況。
class Example:
def __getattribute__(self, attr_name):
raise AttributeError(f'Error for "{attr_name}".')
obj = Example()
obj.foo # AttributeError: Error for "foo".
來自評論:
活動例外是指當前觸發的例外,并且在作業流中,如果你不抓住它,讓它冒泡,它就會終止行程。
uj5u.com熱心網友回復:
我可以為我的問題找到這個:
“活動例外”是什么意思以及它在哪里使用?
然后使用try-except和代碼進入except阻塞,錯誤激活。關于用法,我們可以檢查錯誤,如果不應該處理,可以raise在沒有 arg 的情況下使用
(即使在函式中)。現在在沒有參考行的情況下引發錯誤。我不知道是否有另一種方法可以做到這一點,但我確信這種方法。
例子:
>>> try:
... 10 / 0
... except[ ZeroDivisionError[ as err]]:
... raise
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
>>> def test():
... raise
...
>>> try:
... 10 / 0
... except[ ZeroDivisionError[ as err]]:
... test()
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
>>>
它是否有助于使代碼更短、更優化?
是的。通過使用這種方法,縮短了代碼和錯誤。但是在這種方法中,對例外程序的控制較少,有時會出現問題。
是否可以將它用于我在代碼中顯示的更高一點的任務?
NotImplemented必須回傳編號才能使上述代碼生效。我對此充滿信心,但有可能僅此是不夠的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324113.html
