在本教程中,您將從整個系統的角度學習如何處理Python中的錯誤條件。錯誤處理是設計的關鍵方面,它從最低級別(有時是硬件)一直到最終用戶。如果您沒有一致的策略,您的系統將不可靠,用戶體驗將很差,您將面臨很多挑戰,並且要調試和故障排除。狀態代碼和異常。狀態代碼可以由任何編程語言使用。異常需要語言/運行時支持。
python支持異常。 Python及其標準圖書館使用例外情況,可以自由地報告許多特殊情況,例如IO錯誤,除以零,不超出界限,以及一些不太特殊的情況,例如迭代的終結(儘管隱藏了)。大多數庫都遵循並提出例外。 這意味著您的代碼無論如何都必須處理Python和庫提出的例外,因此您不妨在必要時從代碼中提出異常,而不是依賴狀態代碼。>
>>
這是調用try
子句時的輸出。如果沒有例外,則該程序會跳過def f():<br> return 4 / 0<br>def g():<br> raise Exception("Don't call us. We'll call you")<br>def h():<br> try:<br> f()<br> except Exception as e:<br> print(e)<br> <br> try:<br> g()<br> except Exception as e:<br> print(e)<br>
>如果輸入一個整數,則程序可以按預期工作。但是,如果您輸入浮子或字符串,則程序將停止執行。
當您捕獲異常時,您有三個選項:Please enter a number: 10.3<br>Oops! That was no valid number. Try again...<br>Please enter a number: hello<br>Oops! That was no valid number. Try again...<br>Please enter a number: 10.0<br>Oops! That was no valid number. Try again...<br>Please enter a number: <br>
>吞嚥異常
import json<br>import yaml<br><br>def parse_file(filename):<br> try:<br> return json.load(open(filename))<br> except json.JSONDecodeError<br> return yaml.load(open(filename))<br>
>請注意,其他例外(例如未找到或未讀取權限的文件)將傳播,並且不會被特定條款捕獲。在這種情況下,這是一個很好的策略,您只需要在JSON解析因JSON編碼問題而失敗的情況下嘗試YAML解析。 >如果要處理except Exception
>
<code> <code> <code> dececkion excect 。例如:<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">def f():<br> return 4 / 0<br>def g():<br> raise Exception("Don't call us. We'll call you")<br>def h():<br> try:<br> f()<br> except Exception as e:<br> print(e)<br> <br> try:<br> g()<br> except Exception as e:<br> print(e)<br></pre><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div><div class="contentsignin">登入後複製</div></div>><p>請注意,通過添加<code>as e
,您可以將異常對象綁定到您的名稱e
>的name>。這使您可以執行一些本地處理,但仍然可以讓高層處理。在這裡,raise
>提出不同的異常invoke_function()
Please enter a number: 10.3<br>Oops! That was no valid number. Try again...<br>Please enter a number: hello<br>Oops! That was no valid number. Try again...<br>Please enter a number: 10.0<br>Oops! That was no valid number. Try again...<br>Please enter a number: <br>
如果
函數提出了異常,則對import json<br>import yaml<br><br>def parse_file(filename):<br> try:<br> return json.load(open(filename))<br> except json.JSONDecodeError<br> return yaml.load(open(filename))<br>
query()
close_db_connection()
> finally
的調用可能不會返回連接或提出異常本身。在這種情況下,無需關閉DB連接。
def print_exception_type(func, *args, **kwargs):<br> try:<br> return func(*args, **kwargs)<br> except Exception as e:<br> print(type(e))<br>
>,您必須注意不要在那裡引起任何例外,因為它們會掩蓋原始異常。 open_db_connection()
>
finally
with
def invoke_function(func, *args, **kwargs):<br> try:<br> return func(*args, **kwargs)<br> except Exception as e:<br> print(type(e))<br> raise<br>
上下文管理者在清理代碼中包裝其他機制,即使在清理代碼中均已自動執行。您使用的是process()
>語句,而不是嘗試封鎖。這是一個具有文件的示例:即使with
提出了例外,當退出
在記錄時,記錄異常類型,錯誤消息和stacktrace是很有用的。所有這些信息都可以通過
>對象獲得,但是如果您在異常處理程序中使用方法,則Python記錄系統將為您提取所有相關信息。
>這是我建議的最佳實踐:
def f():<br> return 4 / 0<br>def g():<br> raise Exception("Don't call us. We'll call you")<br>def h():<br> try:<br> f()<br> except Exception as e:<br> print(e)<br> <br> try:<br> g()<br> except Exception as e:<br> print(e)<br>
>如果您遵循此模式(假設您是否正確設置記錄),那麼無論發生什麼情況,您都會在日誌中獲得不錯的記錄,並且可以解決該問題。這是一種浪費,它可能會使您感到困惑,並讓您認為同一問題的多個實例發生了多次記錄的一個實例。
>>最簡單的方法是讓所有例外的方式讓所有異常傳播(除非可以自信地吞嚥和吞嚥),然後將其登錄到您的應用程序/系統/系統的最高級別。功能。最常見的實現是使用日誌文件。但是,對於具有數百,數千或更多服務器的大型分佈式系統,這並不總是最好的解決方案。
跟踪整個基礎架構中的異常,諸如Sentry之類的服務非常有用。它集中了所有異常報告,除了堆疊式添加每個堆棧框架的狀態之外(在提高異常時變量的值)。它還提供了一個非常不錯的界面,其中包含儀表板,報告和方法來通過多個項目分解消息的方法。它是開源的,因此您可以運行自己的服務器或訂閱託管版本。下面是屏幕截圖,是一個屏幕截圖,顯示Sentry如何顯示Python應用程序中的錯誤。
>,這是文件的詳細堆棧跟踪,導致錯誤。在問題的第一個跡象的系統中,嚇壞了的系統不是很有用。
>兩個可以幫助解決錯誤處理的裝飾器的是
>,它會,它會再次登錄例外,然後再提高它,然後將其重新調用,該裝飾器將重新調用功能幾次。
這是一個簡單的實現。裝飾器除了登錄對象。當它裝飾功能並調用函數時,它將在一個try-except子句中包裝呼叫,如果有例外,它將記錄下來並最終提高異常。
def f():<br> return 4 / 0<br>def g():<br> raise Exception("Don't call us. We'll call you")<br>def h():<br> try:<br> f()<br> except Exception as e:<br> print(e)<br> <br> try:<br> g()<br> except Exception as e:<br> print(e)<br>
Please enter a number: 10.3<br>Oops! That was no valid number. Try again...<br>Please enter a number: hello<br>Oops! That was no valid number. Try again...<br>Please enter a number: 10.0<br>Oops! That was no valid number. Try again...<br>Please enter a number: <br>
import json<br>import yaml<br><br>def parse_file(filename):<br> try:<br> return json.load(open(filename))<br> except json.JSONDecodeError<br> return yaml.load(open(filename))<br>
retier >結論錯誤處理對用戶和開發人員都至關重要。 Python在語言和標準庫中為基於異常的錯誤處理提供了很好的支持。通過勤奮地遵循最佳實踐,您可以征服這一經常被忽視的方面。 >已通過Esther Vaati的貢獻進行了更新。 Esther是Envato Tuts的軟件開發人員和作者。
以上是使用Python處理專業錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!