搜尋
首頁後端開發Python教學使用Python處理專業錯誤

在本教程中,您將從整個系統的角度學習如何處理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解析器。如果YAML解析器也失敗了,那麼您讓異常傳播。

>請注意,其他例外(例如未找到或未讀取權限的文件)將傳播,並且不會被特定條款捕獲。在這種情況下,這是一個很好的策略,您只需要在JSON解析因JSON編碼問題而失敗的情況下嘗試YAML解析。 >如果要處理except Exception>

所有例外,則只需使用 <code> <code> <code> dececkion excect 。例如:<pre class="brush:php;toolbar:false">def f():&lt;br&gt; return 4 / 0&lt;br&gt;def g():&lt;br&gt; raise Exception(&quot;Don't call us. We'll call you&quot;)&lt;br&gt;def h():&lt;br&gt; try:&lt;br&gt; f()&lt;br&gt; except Exception as e:&lt;br&gt; print(e)&lt;br&gt; &lt;br&gt; try:&lt;br&gt; g()&lt;br&gt; except Exception as e:&lt;br&gt; print(e)&lt;br&gt;</pre>><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>
>的調用將永遠不會執行,並且DB連接將保持打開狀態。嘗試執行所有異常處理程序後,子句始終執行。這是正確執行操作的方法:

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提出了例外,當退出

>塊的範圍時,即使

提出了例外,無論是否處理過例外,該文件都將立即正確關閉。它在Web應用程序中特別有用,在Web應用程序中,您可以以通用的方式對待所有異常:只需記錄異常,然後將錯誤消息返回給呼叫者。

在記錄時,記錄異常類型,錯誤消息和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應用程序中的錯誤。

>

,這是文件的詳細堆棧跟踪,導致錯誤。在問題的第一個跡象的系統中,嚇壞了的系統不是很有用。

如果您的代碼正在訪問某些不響應的遠程系統,則傳統解決方案是超時,但有時並非每個系統都會按超時設計。隨著條件的變化,超時並不總是很容易校準。

另一種方法是快速失敗然後重試。好處是,如果目標響應迅速,那麼您就不必花費大量時間在睡眠狀態,並且可以立即做出反應。但是,如果失敗了,您可以多次重試,直到確定它確實無法到達並引起例外。在下一部分中,我將介紹一個可以為您做的裝飾器。

>有用的裝飾器使用Python處理專業錯誤

>兩個可以幫助解決錯誤處理的裝飾器的是

>,它會使用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

retier >結論錯誤處理對用戶和開發人員都至關重要。 Python在語言和標準庫中為基於異常的錯誤處理提供了很好的支持。通過勤奮地遵循最佳實踐,您可以征服這一經常被忽視的方面。 >已通過Esther Vaati的貢獻進行了更新。 Esther是Envato Tuts的軟件開發人員和作者。

以上是使用Python處理專業錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs.C:申請和用例Python vs.C:申請和用例Apr 12, 2025 am 12:01 AM

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時的Python計劃:一種現實的方法2小時的Python計劃:一種現實的方法Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python:探索其主要應用程序Python:探索其主要應用程序Apr 10, 2025 am 09:41 AM

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

您可以在2小時內學到多少python?您可以在2小時內學到多少python?Apr 09, 2025 pm 04:33 PM

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎?Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到?Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Python 3.6加載Pickle文件報錯"__builtin__"模塊未找到怎麼辦?Apr 02, 2025 am 07:12 AM

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...

如何提高jieba分詞在景區評論分析中的準確性?如何提高jieba分詞在景區評論分析中的準確性?Apr 02, 2025 am 07:09 AM

如何解決jieba分詞在景區評論分析中的問題?當我們在進行景區評論分析時,往往會使用jieba分詞工具來處理文�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。