Python關於異常處理的教程

来源:https://www.cnblogs.com/python1111/archive/2023/02/21/17141642.html
-Advertisement-
Play Games

一、什麼是異常 異常就是程式運行時發生錯誤的信號(在程式出現錯誤時,則會產生一個異常,若程式沒有處理它,則會拋出該異常,程式的運行也隨之終止),在python中,錯誤觸發的異常如下 1 語法錯誤 語法錯誤,根本過不了python解釋器的語法檢測,必須在程式執行前就改正。 # 語法錯誤示範一 if # ...


一、什麼是異常

異常就是程式運行時發生錯誤的信號(在程式出現錯誤時,則會產生一個異常,若程式沒有處理它,則會拋出該異常,程式的運行也隨之終止),在python中,錯誤觸發的異常如下

在這裡插入圖片描述

1 語法錯誤

語法錯誤,根本過不了python解釋器的語法檢測,必須在程式執行前就改正。

# 語法錯誤示範一
if

# 語法錯誤示範二
def test:
    pass

# 語法錯誤示範三
class Foo
    pass

# 語法錯誤示範四
print(haha

2.邏輯錯誤

# TypeError:int類型不可迭代
for i in 3:
    pass

# ValueError
num=input(">>: ") #輸入hello
int(num)

# NameError
aaa

# IndexError
l=['egon','aa']
l[3]

# KeyError
dic={'name':'egon'}
dic['age']

# AttributeError
class Foo:pass
Foo.x

# ZeroDivisionError:無法完成計算
res1=1/0
res2=1+'str'

二、異常的種類

在python中不同的異常可以用不同的類型(python中統一了類與類型,類型即類)去標識,一個異常標識一種錯誤。

1.常用異常

  • AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x
  • IOError 輸入/輸出異常;基本上是無法打開文件
  • ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤
  • IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
  • IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]
  • KeyError 試圖訪問字典里不存在的鍵
  • KeyboardInterrupt Ctrl+C被按下
  • NameError 使用一個還未被賦予對象的變數
  • SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了)
  • TypeError 傳入對象類型與要求的不符合
  • UnboundLocalError 試圖訪問一個還未被設置的局部變數,基本上是由於另有一個同名的全局變數,導致你以為正在訪問它
  • ValueError 傳入一個調用者不期望的值,即使值的類型是正確的

2 其他異常

  • ArithmeticError
  • AssertionError
  • AttributeError
  • BaseException
  • BufferError
  • BytesWarning
  • DeprecationWarning
  • EnvironmentError
  • EOFError
  • Exception
  • FloatingPointError
  • FutureWarning
  • GeneratorExit
  • ImportError
  • ImportWarning
  • IndentationError
  • IndexError
  • IOError
  • KeyboardInterrupt
  • KeyError
  • LookupError
  • MemoryError
  • NameError
  • NotImplementedError
  • OSError
  • OverflowError
  • PendingDeprecationWarning
  • ReferenceError
  • RuntimeError
  • RuntimeWarning
  • StandardError
  • StopIteration
  • SyntaxError
  • SyntaxWarning
  • SystemError
  • SystemExit
  • TabError
  • TypeError
  • UnboundLocalError
  • UnicodeDecodeError
  • UnicodeEncodeError
  • UnicodeError
  • UnicodeTranslateError
  • UnicodeWarning
  • UserWarning
  • ValueError
  • Warning
  • ZeroDivisionError

三、異常處理

為了保證程式的健壯性與容錯性,即在遇到錯誤時程式不會崩潰,我們需要對異常進行處理

1 提前預防

如果錯誤發生的條件是可預知的,我們需要用if進行處理:在錯誤發生之前進行預防

AGE = 10
while True:
    age = input('>>: ').strip()#在這裡插入代碼片
    if age.isdigit():  # 只有在age為字元串形式的整數時,下列代碼才不會出錯,該條件是可預知的
        age = int(age)
        if age == AGE:
            print('you got it')
            break

輸出

>>: nick
>>: sdkf
>>: 2
>>: 10
you got it

2 之後預防

如果錯誤發生的條件是不可預知的,則需要用到try...except:在錯誤發生之後進行處理

基本語法為

try:
    被檢測的代碼塊
except 異常類型:
    try中一旦檢測到異常,就執行這個位置的邏輯

舉例

try:
    f = [
        'a',
        'a',
        'a',
        'a',
        'a',
        'a',
        'a',
    ]
    g = (line.strip() for line in f)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
except StopIteration:
    f.close()

輸出

a
a
a
a
a

異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。

s1 = 'hello'
try:
    int(s1)
except IndexError as e:  # 未捕獲到異常,程式直接報錯
    print(e)

多分支

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)

輸出

invalid literal for int() with base 10: 'hello'

萬能異常Exception

s1 = 'hello'
try:
    int(s1)
except Exception as e:
    print(e)

多分支異常與萬能異常

  • 如果你想要的效果是,無論出現什麼異常,我們統一丟棄,或者使用同一段代碼邏輯去處理他們,那麼騷年,大膽的去做吧,只有一個Exception就足夠了。

  • 如果你想要的效果是,對於不同的異常我們需要定製不同的處理邏輯,那就需要用到多分支了。

也可以在多分支後來一個Exception

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)

異常的最終執行

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
#學習中遇到問題沒人解答?Python學習交流群:489111204   
#except Exception as e:
#    print(e)
else:
    print('try內代碼塊沒有異常則執行我')
finally:
    print('無論異常與否,都會執行該模塊,通常是進行清理工作')

四、try...except總結

  1. 把錯誤處理和真正的工作分開來
  2. 代碼更易組織,更清晰,複雜的工作任務更容易實現;
  3. 毫無疑問,更安全了,不至於由於一些小的疏忽而使程式意外崩潰了;

五、拋出異常raise

try:
    raise TypeError('拋出異常,類型錯誤')
except Exception as e:
    print(e)

自定義異常

class EgonException(BaseException):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg


try:
    raise EgonException('拋出異常,類型錯誤')
except EgonException as e:
    print(e)

六、斷言assert

assert 1 == 1
try:
    assert 1 == 2
except Exception as e:
    print(e)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在如 rails 這樣的開源庫中,我們常常見到這樣的一類寫法: class_eval <<-RUBY, lxx_file, lxx_line + 1 def xxx # do something here end RUBY 令人困惑不已。 不過這裡的知識點非常簡單,只要掌握了 heredoc 與 e ...
  • 前言 文章主要說明在FA中的中文函數的代碼實現,不僅要知道用法,更要知其實現的原理。前面的用法為FA中的用法,僅支持在FA中使用,源碼可以在其它app中使用。 非原創,代碼收集整理於網路。 進入子頁面 進入子頁面("頁面名稱") lua源碼: function 進入子頁面(name,param) i ...
  • 0、引言 我們在嵌入式開發的過程中,經常可以碰到在一些巨集定義或者是代碼段中使用了do {...} while(0)的語句,從語義上理解,do {...} while(0)內的邏輯就只執行一次,並沒有迴圈執行,粗略看來,似乎畫蛇添足了,那麼為什麼還需要在只執行一次的邏輯外面加上一層do {...} w ...
  • 隊列的概念 在說隊列之前,先回憶一下棧是什麼,我們一般說棧是一個先進後出的數據結構,而隊列就是先進先出的數據結構。 隊列是定在表的一端進行插入,表的另一端進行刪除。 通常,我們稱進數據的一端為隊尾,出數據的一端為隊首(這邊需要註意,經常會記反起碼我是這樣的),數據元素進隊列的過程稱為入隊,出隊列的過 ...
  • 自定義線程池 package com.appletree24; import java.util.ArrayDeque; import java.util.Deque; import java.util.HashSet; import java.util.concurrent.ExecutionEx ...
  • 一、前言 QPython 3c在大佬的改進下,擁有了基於sl4a的FullScreenWrapper2全屏框架。文章將用該框架製作我們的可視化應用【ONE一個】。 二、最終效果如下 三、準備工作 AIDE: 使用佈局助手生成xml佈局代碼 QPython 3C: 使用FullScreenWrappe ...
  • 這一篇主要介紹的是電商網站的統計功能,後臺使用的是Java語言,springMvc框架結合前端Jquer,前端趨勢展示組件使用的是百度開源框架Echarts,這個應該大家或多或少的都有瞭解過,下麵我結合實際項目案例給大家看下項目中是如何實現的。 一、前端頁面到百度下載趨勢圖echarts.js插件, ...
  • ##2.使用I/O復用技術和線程池 網路中有很多用戶會嘗試去connect()這個WebServer上正在listen的這個port,而監聽到的這些連接會排隊等待被accept()。由於用戶連接請求是隨機到達的非同步事件,每當監聽socket(listenfd)listen到新的客戶連接並且放入監聽隊 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...