Python學習筆記:錯誤和異常處理

1. 什么是錯誤和異常

在Python中,錯誤可以分為兩類:

  • 語法錯誤(Syntax Errors):代碼不符合Python語法規則
  • 異常(Exceptions):語法正確的代碼在運行時發生的錯誤
# 語法錯誤示例
print("Hello World"  # 缺少右括號# 異常示例
print(10 / 0)  # ZeroDivisionError: division by zero

2. 常見的異常類型

Python內置了許多異常類型,常見的有:

# NameError - 嘗試訪問未定義的變量
print(undefined_variable)# TypeError - 類型操作錯誤
"2" + 2  # 不能將字符串和整數相加# IndexError - 索引超出范圍
lst = [1, 2, 3]
print(lst[3](@ref)# KeyError - 字典鍵不存在
d = {'a': 1}
print(d['b'])# FileNotFoundError - 文件不存在
open('nonexistent.txt')

3. 異常處理:try-except語句

使用try-except可以捕獲并處理異常:

try:# 可能引發異常的代碼result = 10 / 0
except ZeroDivisionError:# 處理特定異常print("不能除以零!")

捕獲多種異常

try:num = int(input("請輸入一個數字: "))result = 100 / numprint("結果是:", result)
except ValueError:print("輸入的不是有效數字!")
except ZeroDivisionError:print("不能輸入零!")
except Exception as e:  # 捕獲所有其他異常print(f"發生未知錯誤: {e}")

4. try-except-else-finally完整結構

try:file = open('example.txt', 'r')content = file.read()
except FileNotFoundError:print("文件不存在!")
else:# 如果沒有異常發生,執行else塊print("文件內容:", content)
finally:# 無論是否發生異常都會執行print("清理工作...")if 'file' in locals() and not file.closed:file.close()

5. 拋出異常:raise語句

我們可以主動拋出異常:

def check_age(age):if age < 0:raise ValueError("年齡不能為負數")elif age < 18:raise ValueError("未成年禁止訪問")else:print("歡迎訪問")try:check_age(-5)
except ValueError as e:print(f"錯誤: {e}")

6. 自定義異常

我們可以創建自己的異常類型:

class MyCustomError(Exception):"""自定義異常類 - 用于演示特定業務場景的錯誤"""def __init__(self, message, error_code=500):self.message = messageself.error_code = error_codesuper().__init__(f"錯誤代碼 {error_code}: {message}")def __str__(self):"""自定義異常信息的字符串表示形式"""return f"[{self.__class__.__name__}] {self.message}"def calculate_division(dividend, divisor):"""演示函數:執行除法運算,當條件不滿足時拋出不同類型的異常"""if not isinstance(dividend, (int, float)) or not isinstance(divisor, (int, float)):raise TypeError("被除數和除數必須是數字類型")if divisor == 0:raise ZeroDivisionError("除數不能為零")if dividend < 0 or divisor < 0:# 拋出自定義異常:當輸入為負數時raise MyCustomError("計算不支持負數輸入", error_code=400)return dividend / divisordef main():"""主函數:演示異常的捕獲和處理流程"""print("=== 自定義異常演示程序 ===")while True:try:# 獲取用戶輸入num1 = float(input("\n請輸入被除數(輸入q退出):"))num2 = float(input("請輸入除數:"))# 執行計算result = calculate_division(num1, num2)print(f"計算結果:{num1} ÷ {num2} = {result}")except ValueError as e:# 處理非數字輸入if "q" in str(e).lower():print("程序已退出")breakprint(f"輸入錯誤:請輸入有效的數字。錯誤詳情:{e}")except ZeroDivisionError as e:# 處理內置異常print(f"數學錯誤:{e}")except MyCustomError as e:# 處理自定義異常print(f"業務錯誤:{e}(錯誤代碼:{e.error_code})")except TypeError as e:# 處理類型錯誤print(f"類型錯誤:{e}")except Exception as e:# 捕獲所有其他未預期的異常print(f"未知錯誤:{e}")breakif __name__ == "__main__":main()    

?這個示例程序包含以下關鍵特性:

  1. 自定義異常類MyCustomError繼承自Exception,包含錯誤信息和錯誤代碼
  2. 異常拋出函數calculate_division根據不同條件拋出不同類型的異常
  3. 多級異常捕獲:在main函數中使用多個except塊分別處理不同類型的異常
  4. 用戶交互:通過控制臺輸入演示異常的觸發和處理流程

你可以運行這段代碼并嘗試以下輸入場景:

  • 正常輸入兩個正數(如102
  • 輸入零作為除數(觸發ZeroDivisionError
  • 輸入負數(觸發MyCustomError
  • 輸入非數字字符(觸發ValueError
  • 輸入q退出程序

通過觀察不同輸入下的輸出結果,你可以深入理解自定義異常的工作機制和優勢。

7. 斷言assert

assert用于確保某個條件為真,否則拋出AssertionError:

def divide(a, b):assert b != 0, "除數不能為零"return a / bprint(divide(10, 2))  # 正常
print(divide(10, 0))  # 拋出AssertionError

8. 實際應用案例

案例1:處理用戶輸入

while True:try:age = int(input("請輸入您的年齡: "))if age < 0:raise ValueError("年齡不能為負數")breakexcept ValueError as e:print(f"無效輸入: {e}")print(f"您的年齡是: {age}")

案例2:文件操作

def read_file(filename):try:with open(filename, 'r') as file:return file.read()except FileNotFoundError:print(f"文件 {filename} 不存在")return Noneexcept IOError:print(f"讀取文件 {filename} 時發生錯誤")return Nonecontent = read_file('data.txt')
if content:print("文件內容:", content)

案例3:網絡請求

import requestsdef fetch_url(url):try:response = requests.get(url, timeout=5)response.raise_for_status()  # 如果請求不成功,拋出HTTPErrorreturn response.textexcept requests.exceptions.Timeout:print("請求超時")except requests.exceptions.HTTPError as err:print(f"HTTP錯誤: {err}")except requests.exceptions.RequestException as err:print(f"請求錯誤: {err}")return Nonehtml = fetch_url("https://www.example.com")
if html:print("獲取內容成功!")

9. 異常處理的最佳實踐

  1. 1.不要過度使用try-except:只捕獲你知道如何處理的異常
  2. 2.盡量具體:捕獲特定異常而不是通用的Exception
  3. 3.記錄異常信息:使用logging模塊記錄異常詳情
  4. 4.保持簡潔:try塊中只包含可能引發異常的代碼
  5. 5.清理資源:使用finally或上下文管理器(with語句)確保資源釋放
import logginglogging.basicConfig(filename='app.log', level=logging.ERROR)def process_data(data):try:# 只包含可能引發異常的代碼result = complex_operation(data)except ValueError as e:logging.error(f"處理數據時發生值錯誤: {e}")return Noneexcept DatabaseError as e:logging.error(f"數據庫錯誤: {e}")return Noneelse:return result

10. 總結

異常處理是Python編程中非常重要的部分,合理使用異常處理可以使程序:

  • 更加健壯,能夠處理意外情況
  • 更易于調試和維護
  • 提供更好的用戶體驗

異常處理不是用來隱藏錯誤的,而是為了優雅地處理錯誤情況!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87300.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么要進行行為驗證,行為驗證方式有哪些?

進行行為驗證的主要目的是提高賬戶安全性、防范自動化攻擊、增強用戶身份確認精準度、優化用戶體驗。其中&#xff0c;提高賬戶安全性最為關鍵。行為驗證能通過分析用戶的行為模式&#xff0c;如操作習慣、設備使用特點等&#xff0c;識別出非正常或惡意活動&#xff0c;迅速采…

主流Java Redis客戶端(Jedis、Lettuce、Redisson)差異對比

主流Java客戶端對比&#xff1a;Jedis采用阻塞I/O&#xff0c;需連接池支持&#xff1b;Lettuce/Redisson基于Netty非阻塞I/O。Jedis輕量但并發能力弱&#xff0c;Lettuce支持10K并發且為SpringBoot默認&#xff0c;Redisson提供分布式功能但性能稍遜。 Redisson Lettuce 在 …

使用Hexo搭建博客網站(二)

設置主題 我們在官方主題中選擇一個自己喜歡的主題 來到GitHub&#xff0c;將它git clone到當前項目的themes文件夾中 設置_config.yml 找到 # Extensions ## Plugins: https://hexo.io/plugins/ ## Themes: https://hexo.io/themes/ theme: landscape 只需將這個landscape名字…

springAI 大模型應用開發

一 筆記總結 1.1 spring AI 實戰 1.1.1 spring aideepseek整合 通過使用spring ai 調用大模型deepseek&#xff0c;實現對話聊天&#xff0c;文字轉圖片&#xff0c;文字轉音頻。 1.1.2 OLLAMA Ollama 專為本地部署和運行大型語言模型&#xff08;LLM&#xff09;而設計的…

Java + Spring Boot 后端防抖應用實例

防抖工具&#xff08;適用單機部署&#xff09; DebounceUtil.java package com.weiyu.utils;import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.stereotype.Component;import java.util.Map; import java.util.c…

PostgreSQL 快速入門

PostgreSQL介紹 PostgreSQL 是一個功能強大的開源關系型數據庫系統&#xff0c;它使用并擴展了 SQL 語言&#xff0c;并結合了許多功能&#xff0c;可以安全地存儲和擴展復雜的數據工作 PostgreSQL 因其經過驗證的架構、可靠性、數據完整性、強大的功能集、可擴展性以及軟件背…

CppCon 2016 學習:Out of memory? Business as usual.

當程序因為內存耗盡而拋出 std::bad_alloc 異常時&#xff0c;這并不意味著程序必須崩潰或停止運行。我們應該考慮“內存不足”作為一種可能正常出現的情況&#xff08;“Out of memory? Business as usual.”&#xff09;&#xff0c;并設計應用程序能優雅地處理這種異常。 具…

廟算兵棋推演AI開發初探(8-神經網絡模型接智能體進行游戲)

前言の碎碎念 由于我做的模仿學習&#xff0c;可能由于沒有完全模仿&#xff0c;可以說效果很爛……后來用強化學習優化&#xff0c;這個倒是不用自己做數據集了&#xff0c;為方便大家只搞代碼&#xff0c;這里只說這部分的經歷和方法。 實踐基礎介紹 1-動作 先介紹一個強化…

Uart_Prj02 Windows 窗口版串口_Step1

完成上位機控制臺串口后&#xff0c;接下來想用C#做一個Windows 窗口版的串口。上位機編程不是很熟練&#xff0c;每天學一點做一點。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.…

自動駕駛系統研發—從工程視角看純視覺自動駕駛的安全挑戰與應對策略

???? 歡迎來到我的技術小筑,一個專為技術探索者打造的交流空間。在這里,我們不僅分享代碼的智慧,還探討技術的深度與廣度。無論您是資深開發者還是技術新手,這里都有一片屬于您的天空。讓我們在知識的海洋中一起航行,共同成長,探索技術的無限可能。 ?? 探索專欄:學…

PostgreSQL認證怎么選?PGCP中級認證、PGCM高級認證

上圖是2025年6月份最新的db-engines上的數據庫排名情況&#xff0c;可以看出PostgreSQL數據庫仍然呈上升趨勢&#xff0c;跟排名第三的"Microsoft SQL Server"起來越接近&#xff0c;國內亦是如此&#xff0c;PostgreSQL的熱潮依在&#xff0c;可見學習PostgreSQL數據…

Hive 3.x數據靜態脫敏與加密

引言 在大數據時代&#xff0c;數據已成為企業和組織的核心資產。作為數據處理的重要平臺&#xff0c;Hive 3.x存儲著大量敏感信息&#xff0c;如用戶個人身份、財務數據、商業機密等。如何確保這些數據在存儲和處理過程中的安全性&#xff0c;成為數據從業者關注的焦點。數據…

CppCon 2016 學習:Lightweight Object Persistence With Modern C++

你給出的這段文字是某個演講、論文或者技術文檔的概要&#xff08;Overview&#xff09;部分&#xff0c;內容主要是關于內存分配器&#xff08;allocator&#xff09;設計以及**對象持久化&#xff08;object persistence&#xff09;**的一些思路。讓我幫你逐條解析和理解&am…

IPv6中的ARP“NDP協議詳解“

一、概述 在IPv4網絡環境當中,我們想要與對端進行網絡通信時,首先需要去解析對方的MAC地址這樣我們才能封裝二層數據幀,就算訪問不同網絡時也需要解析網關的MAC,這些都是需要我們的ARP協議來進行操作完成的,但是在我們的IPv6網絡環境當中并沒有ARP協議,而是通過NDP協議來完成類…

TortoiseSVN遷移到本地git

將項目從Subversion&#xff08;SVN&#xff09;遷移到Git是許多開發團隊的需求&#xff0c;因為Git提供了更多的功能和靈活性。本文將詳細介紹如何使用TortoiseSVN將項目遷移到本地Git倉庫。 一、準備工作 安裝Git&#xff1a;確保在本地機器上安裝了Git。可以通過以下命令檢…

高性能 Web 服務器之Tengine

一、概述 Tengine 是一個由淘寶網發起的 Web 服務器項目。它基于 Nginx 然后針對大訪問量網站的需求&#xff0c;添加了很多高級功能和特性&#xff0c;從 2011 年 12 月開始&#xff0c;Tengine 正式開源。Tengine 的性能和穩定性已經100多家大型網站如淘寶網&#xff0c;天貓…

簡單實現HTML在線編輯器

我們繼續來看一下如何開發一個簡單的html在線編輯器&#xff0c;要求很簡單 能夠同時編輯html&#xff0c;css&#xff0c;js代碼&#xff0c;并且運行之后可以同時預覽效果 一&#xff1a;前置知識 在H5中設置了一個新的標簽&#xff0c;<iframe>&#xff0c; 用于在當前…

【Bluedroid】藍牙啟動之核心模塊(startProfiles )初始化與功能源碼解析

本文深入解析Android藍牙協議棧中 start_profiles 函數及其調用的核心模塊初始化邏輯,涵蓋 BNEP、PAN、A2DP、AVRC、HID Host、BTA_AR 等關鍵配置文件和應用層模塊。通過代碼分析與流程梳理,闡述各模塊如何通過全局控制塊、狀態機、回調機制實現功能初始化、連接管理及數據交…

RK3576 Android14 DMIC調制

一、背景 近期項目中有個DMIC調試的需求&#xff0c;擱置了較長時間&#xff0c;現今著手調試&#xff0c;遂作記錄。 二、開發環境 OS&#xff1a;Android14 Platform&#xff1a;RK3576 Linux Version&#xff1a;6.1.99 SDK Version&#xff1a;android-14.0-mid-rkr6 …

使用 Prometheus 監控 Spring Boot 應用

SpringBoot+Prometheus+Grafana實現監控 邏輯如圖 應用程序在生產環境中運行時,監控其運行狀況是非常必要的。通過實時了解應用程序的運行狀況,才能在問題出現之前得到警告,也可以通監控應用系統的運行狀況,優化性能,提高運行效率。 一、監控 Spring Boot 應用 下面我們…