python專題-異常處理(基礎)

来源:http://www.cnblogs.com/cmt110/archive/2017/09/01/7464881.html
-Advertisement-
Play Games

之前在學習python的時候有整理過python異常處理的文章,不夠簡單也不夠完整,所以決定再整理一篇,算做補充。 http://www.cnblogs.com/cmt110/p/7464748.html python shell 打開一個不存在的文件abc.txt 文件,當系統找不到abc.txt ...


  之前在學習python的時候有整理過python異常處理的文章,不夠簡單也不夠完整,所以決定再整理一篇,算做補充。

http://www.cnblogs.com/cmt110/p/7464748.html

 

python shell

>>> open('abc.txt','r')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'abc.txt'

  打開一個不存在的文件abc.txt 文件,當系統找不到abc.txt 文件時,就會拋出給我們一個IOError類型的錯誤,No such file or directory:abc.txt (沒有abc.txt這樣的文件或目錄)

 

Try...except...

 

  假如,我們已經知道這種類型的錯誤,那麼就可以通過一個異常撲捉來撲捉這個錯誤。我們可以通過try...except 來接收這個錯誤。打開文件寫入:

try:
    open("abc.txt",'r')
except IOError:
    pass 

   再來運行程式就會看不到任何錯誤,因為我們用except 接收了這個IOError錯誤。pass 表示實現了相應的實現,但什麼也不做。

  假如我不是打開一個文件,而是輸出一個沒有定義的變數呢? 

try:
    print  aa
except IOError:
    pass 

顯然,在上面的代碼中我並沒有對aa 賦值,運行結果:

Traceback (most recent call last):
  File "/home/fnngj/py_se/tryy.py", line 3, in <module>
    print  aa
NameError: name 'aa' is not defined

  我們已經用except 接收錯誤了,為什麼錯誤還是還是拋出來了。如果你細心會發現這一次的錯誤類型是NameError ,而我接收類型是IOError ,所以要想接收這個print的錯誤,那麼需要修改接收錯誤的類型為NameError

  雖然,我知道print 語句是可能會拋一個NameError 類型的錯誤,雖然接收了這個類型錯誤,但我不知道具體的錯誤提示信息是什麼。那麼,我能不能把錯誤信息列印出來呢?當然可以:

try:
    print  aa
except  NameError, msg:
    print  msg

  我們在接收錯誤類型的後面定義一個變數msg用於接收具體錯誤信息然後將msg接收的錯誤信息列印。再來運行程式:

name 'aa' is not defined

現在只列印了一行具體錯誤信息。

  

異常的拋出機制:

1、如果在運行時發生異常,解釋器會查找相應的處理語句(稱為handler.

2、要是在當前函數里沒有找到的話,它會將異常傳遞給上層的調用函數,看看那裡能不能處理。

3、如果在最外層(全局“main”)還是沒有找到的話,解釋器就會退出,同時列印出traceback以便讓用戶找到錯誤產生的原因。

 

註意:雖然大多數錯誤會導致異常,但一個異常不一定代表錯誤,有時候它們只是一個警告,有時候它們可能是一個終止信號,比如退出迴圈等。

 

 

try...finally...

 

try...finally...子句用來表達這樣的情況:

我們不管線捕捉到的是什麼錯誤,無論錯誤是不是發生,這些代碼必須運行,比如文件關閉,釋放鎖,把資料庫連接返還給連接池等。 

創建文件poem.txt

tryf.py

複製代碼
import time

try:
    f = file('poem.txt')
    while True: # our usual file-reading idiom
        line = f.readline()
        if len(line) == 0:
            break
        time.sleep(2)
        print line,


finally: f.close() print 'Cleaning up...closed the file'
複製代碼

運行程式(windows命令提示符或linux終端下運行)

複製代碼
...$ python tryf.py 
abc
efg
^CCleaning up...closed the file
Traceback (most recent call last):
  File "tryy.py", line 18, in <module>
    time.sleep(2)
KeyboardInterrupt
複製代碼

  程式讀poem.txt文件中每一行數據列印,但是我有意在每列印一行之前用time.sleep方法暫停2秒鐘。這樣做的原因是讓程式運行得慢一些。在程式運行的時候,按Ctrl-c中斷/取消程式。

  我們可以觀察到KeyboardInterrupt異常被觸發,程式退出。但是在程式退出之前,finally從句仍然被執行,把文件關閉。

 

 

到目前為止,我們只討論瞭如何捕捉異常,那麼如何拋出異常呢?

 

Raise拋出異常

 

使用raise來拋出一個異常:

tryr.py

#coding=utf-8
filename = raw_input('please input file name:')

if filename=='hello':
    raise NameError('input file name error !')

  程式要求用戶輸入一個文件名,如果用戶輸入的文件名是hello ,那麼拋出一個NameError的異常,用戶輸入hello 和NameError異常之間沒有任何必然聯繫,我只是人為的通過raise來這樣定義,我當然也可以定義稱TypeError ,但我定義的異常類型必須是python提供的。

 

附錄:

常見的python異常類型

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

-Advertisement-
Play Games
更多相關文章
  • Python基礎 1.寫在前面 最近在學習Python,對學習到的知識和學習中產生的思考或想法進行一些總結,儘量讓自己的知識邏輯結構顯得清晰並讓自己瞭解的更透徹一些。鑒於剛學習水平有限,一些想法和思考會留在以後實現和解決。 本人再用Python3.5版本,所以Python標準庫參考的是3.5.2版本 ...
  • 報錯信息 解決方法 應該是CA證書驗證失敗造成的錯誤,下載個CA證書 修改cafile路徑,保存 ...
  • age = 3 if age >= 18: print('your age is', age) elif age >= 10: print('your age is', age) else: print('your age is', age) s = input('birth: ') birth = ...
  • 在編寫爬蟲時,性能的消耗主要在IO請求中,當單進程單線程模式下請求URL時必然會引起等待,從而使得請求整體變慢。 1. 同步執行 2. 多線程執行(多個線程併發執行,時間長短取決於最長的URL請求) 3. 多進程執行(在CPU核心數足夠的情況下,多個進程並行執行,時間長短取決於最長的URL請求,理論 ...
  • 指針是一個特殊的變數,它裡面存儲的數值被解釋成為記憶體里的一個地址。 要搞清一個指針需要搞清指針的四方面的內容:指針的類型,指針所指向的 類型,指針的值或者叫指針所指向的記憶體區,還有指針本身所占據的記憶體區。讓我們分別說明。 先聲明幾個指針放著做例子: 例一: (1)int*ptr; (2)char*p ...
  • AJAX +JSON=》JSP AJAX AJAX 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。 通過在後臺與伺服器進行少量數據交換,AJAX 可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。 傳統的網頁(不使用 AJAX)如果需要更新內容 ...
  • 之前寫過一篇 Python使用MySQL資料庫的博客,主要使用的是Python2和MySQLdb驅動。 python使用mysql資料庫 Python2 > Python3 MySQLdb --> PyMySQL 一,安裝PyMySQL Python是編程語言,MySQL是資料庫,它們是兩種不同的技 ...
  • 偽靜態 偽靜態是相對真實靜態來講的,通常我們為了增強搜索引擎的友好面,都將文章內容生成靜態頁面,但是有的朋友為了實時的顯示一些信息。或者還想運用動態腳本解決一些問題。不能用靜態的方式來展示網站內容。但是這就損失了對搜索引擎的友好面。怎麼樣在兩者之間找個中間方法呢,這就產生了偽靜態技術。就是展示出來的 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...