網站首頁 編程語言 正文
前言
繼續更新Python基礎語法,到目前為止Python基礎語法已經接近了尾聲,本次錯誤與異常處理更新完后會對文件、數據庫、包管理、模塊管理、正則表達式的使用進行更新。完成這幾個大致的任務之后將會更新爬蟲與數據分析。本專欄所寫的東西非常的適用初學者,當然也非常適合老手,每一部分都有很全面的編程技巧。相信大家看完后會感覺受益匪淺。(文末附有常見異常表)
異常與錯誤的概念
錯誤顧名思義就是由于某種原因,產生了不符合我們預期的結果。我們的代碼在運行時非常的有可能出現錯誤,我們有時又稱這種現象為BUG,在Python中異常通常指的是我們的Python解釋器發現了我們程序中存在的錯誤,自己無法解決該錯誤的時候向操作系統提出了報告引發程序中斷。正如現實中我們個人犯錯而監管我們的人發現我們的錯誤,發現我們的異常舉動并進行處理。及時幫我們糾正錯誤行為。
錯誤分類
語法錯誤
語法錯誤又稱為編譯錯誤,是計算機操作系統在執行你的代碼的時候,由于你代碼存在語法性問題無法開始執行程序導致的錯誤,一般就是函數名、關鍵字用錯導致或者進行導包的時候導入了不存在的包。隨著編譯器的迭代更新不斷變強,這種錯誤已經非常少見了。Python中編譯錯誤提示SyntaxErrorl例如下圖(缺少一半括號):
運行時錯誤
運行時錯誤指的是程序通過了編譯,計算機操作系統開始執行你的程序在代碼執行過程中出由于編程者的疏忽,產生了代碼之間的矛盾導致的錯誤。例如:沒有考慮到數組邊界或者變量范圍導致數組越界、零除異常...這種錯誤會導致你的程序突然就掛掉一定情況下會造成灰常大的損失。例如以下情況:
邏輯錯誤
這種錯誤往往是人們最煩惱的錯誤,因為操作系統不會直接拋出異常給我們看,你的程序也可以正常運行,但是對程序輸入值之后得到的結果就是不對。非常的氣人,我們能改進這種錯誤的方式就是baidu、動腦思考、進行調試、實在不行找個老鳥幫你看看。常見的錯誤有:死循環、表達式錯誤、局部全局變量混用....
異常處理機制
捕獲異常并處理
Python中采用了結構化的異常處理機制我們可以通過try對異常進行捕獲,然后在except中進行異常的處理。最后在finally中進行資源釋放之類的工作(有沒有異常finally中的代碼都會執行),與其他語言不同的是,在Python中引入了一個else機制,else中的語句只有在try中的代碼沒有異常的時候才會執行。有異常就不執行。詳細操作見下面代碼,正如所見,可以對多個類型的異常進行捕獲。對多個異常進行捕獲的話需要將類型涵蓋范圍較小的異常放在前面,而在捕獲之前一般由try代碼塊中的代碼或者函數進行異常的拋出
# 異常的捕獲
a=int(input('輸入除數:'))
b=int(input('輸入被除數:'))
try:
res=a/b
except ZeroDivisionError:
print('除數不可以為0')
# 相同處理方式的異常可以這么寫
except (BaseException,TypeError):
print('有錯誤')
else:
print('您的結果為',res)
finally:
print('感謝使用!')
主動拋出異常
我們可以輕松的進行異常的捕獲并進行解決。但是有時候我們有一種需求就是將錯誤拋出給上一層進行處理。這時候主動拋出異常就登場了。在Python中主動拋出異常使用的是raise關鍵字。raise關鍵字一般與自定義異常類一塊進行使用,所以大家先記住raise是主動拋出異常的關鍵字,待會到自定義異常類處看代碼即可。
斷言處理
斷言處理使用語法為:assert <布爾表達式>或者assert <布爾值表達式> , <字符串表達式>。assert會先對布爾值表達式進行判斷,如果表達式為True就不進行操作,否則會拋出異常。并在拋出的異常中輸出字符串表達式的信息。具體操作可以看以下代碼:
'''
3 錄入一個學生的成績,把該學生的成績轉換為A優秀、B良好、C合格、D不及格的形式,
最后將該學生的成績打印出來。要求使用assert斷言處理分數不合理(小于0或者大于100)的情況
請編寫程序。
'''
n=int(input())
assert n in range(101),"您輸入的成績不合理!"
if n>=85:
print("優秀!")
elif n>=70:
print("良好!")
elif n>=60:
print("合格!")
else:
print("不及格!")
自定義異常類
Python官方庫中提供了一系列的異常處理類,在Python中所有的異常均由類實現,所有的異常類又繼承自BaseException類,程序運行時出現的異常大多繼承自Exception類。Python支持自定義異常類。自定義異常類一般繼承Exception或者其子類名稱一般以Exception或者Error命名。
自定義異常類以及主動拋棄異常
'''
自己定義一個異常類,繼承Exception類, 捕獲下面的過程:判斷input()輸入的字符串長度是否小于5,
如果小于5,比如輸入長度為3則輸出:"The input is of length 3, expecting at least 5“,
大于5則輸出"success”。
'''
class StrLenError(Exception):
def __init__(self,s):
Exception.__init__(self,s)
self.s =s
def __str__(self):
return f"The input is of length {len(self.s)}, expecting at least 5"
n=input()
if len(n)<=5:
raise StrLenError(n)
else:
print("success")
常見異常及釋義
以下是一些常見的類及引發該類異常的錯誤描述:
類名 | 描述 |
---|---|
SyntaxError | 發生語法錯誤時引發 |
FileNotFoundError | 未找到指定文件或目錄時引發 |
NameError | 找不到指定名稱的變量時引發 |
ZeroDivisionError | 除數為0時的異常 |
IndexError | 當使用超出列表范圍的索引時引發 |
KeyError | 當使用映射不存在的鍵時引發 |
AttributeError | 當嘗試訪問未知對象屬性時引發 |
TypeError | 當試圖在使用a類型的場合使用b類型時引發 |
附:用戶自定義異常實例
你可以通過創建一個新的異常類來擁有自己的異常。異常類繼承自 Exception 類,可以直接繼承,或者間接繼承,例如:
>>> class NewError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
>>> try:
raise NewError(2*2)
except NewError as e:
print('New exception occurred, value:', e.value)
My exception occurred, value: 4
>>> raise NewError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.NewError: 'oops!'
在這個例子中,類 Exception 默認的 init() 被覆蓋。
當創建一個模塊有可能拋出多種不同的異常時,一種通常的做法是為這個包建立一個基礎異常類,然后基于這個基礎類為不同的錯誤情況創建不同的子類:
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
大多數的異常的名字都以"Error"結尾,就跟標準的異常命名一樣。
總結
原文鏈接:https://blog.csdn.net/apple_51931783/article/details/124618286
相關推薦
- 2022-09-08 pytorch中Tensor.to(device)和model.to(device)的區別及說明_p
- 2022-06-23 C++11系列學習之類型推導_C 語言
- 2022-05-06 Python?ORM框架之SQLAlchemy?的基礎用法_python
- 2022-07-12 Linux中xargs命令的用法
- 2023-08-01 el-table 拖拽列寬出現空白列問題
- 2022-11-04 golang?cache帶索引超時緩存庫實戰示例_Golang
- 2022-10-21 Go語言使用goroutine及通道實現并發詳解_Golang
- 2022-11-05 Nginx配置文件nginx.conf的基本配置實例詳解_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支