1. 程式人生 > >Python-異常處理try(一)

Python-異常處理try(一)

平時在做自動化測試的時候,腳本里面會經常用到try和except,但是感覺好像對try的用法理解的不是很透徹,今天在這裡重新學習下,也分享給大家!

  • 大家看一下 try 和 except 的工作原理:
    try:
        #可能發生異常的程式碼
        <語句>
    except <各種異常>,e:
        #當try中語句發生異常的時候,就會執行except中的語句
        <語句>

也就是說,我們把可能在執行過程中會產生異常的語句寫在try中,讓except去幫我捕獲異常資訊,並執行except中的語句。

那麼會有疑問,把這種感覺會引發異常的語句放在try裡面和外面有什麼區別呢?讓我們來看一段程式碼,就會立刻明白兩者的區別了!

  • 沒有try
#encoding=utf-8

print 1
print 1/0
print 2
print 'a'

執行結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
Traceback (most recent call last):
1
  File "D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py"
, line 4, in <module> print 1/0 ZeroDivisionError: integer division or modulo by zero Process finished with exit code 1

這裡我們可以看到,程式碼中,引發異常的語句是 print 1/0,執行到這裡的時候,程式報錯,後面的 print 2,print ‘a’ 就沒有再被執行了,程式執行到 print 1/0 之後就中斷了。

  • 有try的
#encoding=utf-8
print 'start'

try:
    print 1/0
except Exception
,e: print e.message print 'over'

執行結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
start
integer division or modulo by zero
over

Process finished with exit code 0

這裡我們可以看到,print 1/0 引發的異常,但是由於寫在了try裡面,就會被except擷取到,並列印異常資訊,並且後面的print ‘over’語句也還可以執行,不會讓程式中斷。

看到這裡大家應該都知道了兩者的區別,對於我來講我覺得最直觀的感受就是把異常語句寫在try中的話不會影響後面程式碼的執行,不會讓程式在異常語句處中斷。
這裡寫圖片描述
【注意】
如果except沒有捕獲到應該捕獲的異常資訊,那麼程式會自動報錯,程式中斷,效果和沒有寫在try中一樣,後面的語句不會被執行,程式碼如下:

try:
    print 100 / float(number)
except IOError,e:
    print traceback.format_exc()

print True

執行結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
please input a number: 0
Traceback (most recent call last):
  File "D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py", line 20, in <module>
    print 100 / float(number)
ZeroDivisionError: float division by zero

Process finished with exit code 1

這裡我們可以看到啊,我們這裡寫的except是用來截獲IOError的,所以相當於異常沒有被截獲,所以程式自己報錯了,導致後面的程式碼就不會再被執行了,效果和沒有try的效果是一樣的。所以,為了避免這樣的情況發生,不管寫了幾個except,最後都要加上萬能的Exception,這樣就可以捕獲所有的異常資訊,保證程式不會被中斷;
程式碼如下:

try:
    print 100 / float(number)
except IOError,e:
    print traceback.format_exc()
except Exception,e:
    print traceback.format_exc()

print True

執行結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
please input a number: 0
Traceback (most recent call last):
  File "D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py", line 20, in <module>
    print 100 / float(number)
ZeroDivisionError: float division by zero

True

Process finished with exit code 0

這裡我們可以看到,寫了Exception後,即使IOError擷取不到報錯資訊,Exception也會捕獲到異常,這樣就不會影響後面程式碼的正常執行了;

  • 再來看一下try–except–else的關係
    try是可以和else搭配使用的,但是它們三者的執行順序是如何的呢?讓我們來看下面的程式碼,就會清楚了!
#encoding=utf-8
import traceback

print 'start'

number = raw_input('please input a number: ')
try:
    print 100 / float(number)
except ValueError, e:
    print traceback.format_exc()
except ZeroDivisionError, e:
    print traceback.format_exc()
except Exception, e:
    print traceback.format_exc()
else:
    print 'except was not executed , so else was executed'

print 'over'

執行指令碼(情況1)—觸發except,結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
start
please input a number: jik
Traceback (most recent call last):
  File "D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py", line 8, in <module>
    print 100 / float(number)
ValueError: could not convert string to float: jik

over

Process finished with exit code 0

從結果中可以看出,else沒有被執行;

我們再來執行指令碼(情況2)—不觸發except,結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
start
please input a number: 12
8.33333333333
except was not executed , so else was executed
over

Process finished with exit code 0

從結果中可以看出,else被執行了;

所以得到關於try–except–else三者的執行關係的結論如下:
【當任何一個except都不被觸發時,執行完try中的語句,就會執行else中的語句。】

  • 悄悄告訴你,try 也是可以巢狀的呦~~~
    程式碼如下:
#encoding=utf-8
import traceback

while 1:
    number = raw_input('please input a number: ')
    try:
        try:
            try:
                try:
                    print 100 / float(number)
                    break
                except IOError,e:
                    print traceback.format_exc()
            except ValueError,e:
                print traceback.format_exc()
        except ZeroDivisionError,e:
            print traceback.format_exc()
    except Exception,e:
        print traceback.format_exc()

print 'ajin , mommy love you'

執行結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
please input a number: xo
Traceback (most recent call last):
  File "D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py", line 9, in <module>
    print 100 / float(number)
ValueError: could not convert string to float: xo

please input a number: 0
Traceback (most recent call last):
  File "D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py", line 9, in <module>
    print 100 / float(number)
ZeroDivisionError: float division by zero

please input a number: 1
100.0
ajin , mommy love you

Process finished with exit code 0

這裡我們可以直觀的看到,try是可以網上尋找的,本層的except如果捕獲不到異常,就會向上面的try中的except去尋找,直到最外層,若最外層Except也沒有捕獲到,就會程式中斷報錯,導致後面的程式碼不會被執行;

  • try-except-else-finally的執行關係
    前面已經說過了try-except-else的關係,那麼finally呢,和他們的關係如何呢?
    看一段程式碼就會理解:
    def test04(self):
        try:
            print 2/0
        except Exception,e:
            print  e.message
        else:
            print 'else'
        finally:
            print 'finally'

結果如下:

integer division or modulo by zero
finally

可以看出,出發了except,else 是不被執行的,但是並沒影響finally的執行;
再看一段程式碼:

    def test04(self):
        try:
            print 2/1
        except Exception,e:
            print  e.message
        else:
            print 'else'
        finally:
            print 'finally'

結果如下:

2
else
finally

可以看出,沒有異常,else被執行,finally也被執行;

所以得出結論:

【finally不管有沒有異常,最後都會被執行】
  • try–except–raise/print 的區別
    來一段程式碼try–except–print e.message【執行報告輸出到txt中】:
#encoding=utf-8
import traceback
import unittest
from HTMLTestRunner import HTMLTestRunner

class test_raise(unittest.TestCase):
    def setUp(self):
        pass

    def test01(self):
        try:
            print 2/0
        except Exception,e:
            #這裡用的是:print e.message,觀察test01的測試報告
            print e.message
        else:
            print 'test01-else'
        finally:
            print 'test01-finally'

    def test02(self):
        try:
            print 2/0
        except Exception,e:
            #這裡用的是 :raise e,觀察test02的測試報告
            raise e
        else:
            print 'test02-else'
        finally:
            print 'test02-finally'

    def tearDown(self):
        pass

if __name__=='__main__':
    suite=unittest.TestSuite()
    suite.addTests([test_raise('test01'),test_raise('test02')])
    with open('test_raise.txt','a')as fp:
        fp.write('\n')
        fp.write('* * * '*8+'測試報告'+'* * * '*8+'\n')
        runner=unittest.TextTestRunner(stream=fp,verbosity=2)
        runner.run(suite)

我們看一下控制檯輸出的內容:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
integer division or modulo by zero
test01-finally
test02-finally

Process finished with exit code 0

再看一下txt測試報告中的內容:


* * * * * * * * * * * * * * * * * * * * * * * * 測試報告* * * * * * * * * * * * * * * * * * * * * * * * 
test01 (__main__.test_raise) ... ok
test02 (__main__.test_raise) ... ERROR

======================================================================
ERROR: test02 (__main__.test_raise)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py", line 26, in test02
    raise e
ZeroDivisionError: integer division or modulo by zero

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (errors=1)

這裡可以看到,test01中的except使用的print e.message,這樣在測試報告中,這條用例不會報error,而是OK,print的e.message是輸出到控制檯的,不會再報告中列印;但是test02中的except使用的raise e ,這樣在報告中,該條用例的執行結果是Error,raise的報錯資訊不會在控制檯輸出,而是會在報告中打印出來;

  • 再來一段try–except–raise e的程式碼【測試報告輸出到HTML檔案中】
#encoding=utf-8
import traceback
import unittest
from HTMLTestRunner import HTMLTestRunner

class test_raise(unittest.TestCase):
    def setUp(self):
        pass

    def test01(self):
        try:
            print 2/0
        except Exception,e:
            #這裡用的是:print e.message,觀察test01的測試報告
            print e.message
        else:
            print 'test01-else'
        finally:
            print 'test01-finally'

    def test02(self):
        try:
            print 2/0
        except Exception,e:
            #這裡用的是 :raise e,觀察test02的測試報告
            raise e
        else:
            print 'test02-else'
        finally:
            print 'test02-finally'

    def tearDown(self):
        pass

if __name__=='__main__':
    suite=unittest.TestSuite()
    suite.addTests([test_raise('test01'),test_raise('test02')])
    with open('HTMLReport.html','w')as fp:
        runner=HTMLTestRunner(stream=fp,title='raise e and print e',description='Generated by HTMLTestRunner.',verbosity=2)
        runner.run(suite)

控制檯輸出的結果如下:

C:\Python27\python.exe D:/python/Sat0624KeyWordDriven/keyword_driven_frame/abnormal/demo.py
ok test01 (__main__.test_raise)
E  test02 (__main__.test_raise)

Time Elapsed: 0:00:00

Process finished with exit code 0

可以看到,測試用例test01是OK,控制檯不會列印print e.message的內容;測試用例test02是E,控制檯不列印raise丟擲的異常e;
html測試報告的輸出結果如下:

這裡寫圖片描述
這裡可以看到,在報告裡面,test01的執行結果是pass,但是會列印處print e.message的內容和finally中print的內容;test02的執行結果是error,會打印出raise丟擲的異常資訊,也會打印出finally的print的內容;

用txt作為報告和HTML作為測試報告的共同特點都是,若except用的是print e.message,那麼當測試用例中有異常發生時,用例的執行結果是ok,而不是error,也不會丟擲引發異常的位置;若except後面用的是raise,就會在報告中正確的顯示用例的執行結果,並且丟擲異常資訊和發生異常的位置;可以很直觀的看出哪條用例執行出錯了,和所丟擲的異常資訊,可以更方便的定位錯誤資訊。

  • 所以綜上所述,對我自己而言的話,如果用unittest來組織測試用例的執行的情況下,我打算用HTML來生成測試報告,而不是txt,不論是控制檯顯示的執行結果還是報告裡面展示的結果,都更為詳細和直觀。
  • 在寫測試指令碼的時候,except 後面要用raise,而不是print e.message;
    這裡寫圖片描述
    這裡寫圖片描述

相關推薦

Python-異常處理try

平時在做自動化測試的時候,腳本里面會經常用到try和except,但是感覺好像對try的用法理解的不是很透徹,今天在這裡重新學習下,也分享給大家! 大家看一下 try 和 except 的工作原理: try: #可能發生異常的

Python-異常處理try

在Python-異常處理try(一) 中最後我們提到過關於try-except-raise的內容,本篇部落格,補充關於raise的一個知識點,Python-異常處理try(一) 的連結如下: http://blog.csdn.net/weixin_395680

Python資料處理為什麼要學習 Numpy & Pandas?

今天我們介紹兩個科學運算當中最為重要的兩個模組,一個是numpy,一個是 pandas。任何關於資料分析的模組都少不了它們兩個。 一、主要用途: 資料分析 機器學習 深度學習 二、為什麼使用 numpy & pandas

Python資料處理為什麼要學習 Numpy & Pandas?

今天我們介紹兩個科學運算當中最為重要的兩個模組,一個是numpy,一個是 pandas。任何關於資料分析的模組都少不了它們兩個。 一、主要用途: 資料分析 機器學習 深度學習 二、為什麼使用 n

異常處理框架

1、新建 【HloException.java】 package com.test.exception; public class HLoException extends Exception{ static final long serialVer

Python-OpenCV 處理影象:基本操作 cv2

0x00. 圖片讀、寫和顯示操作 安裝好 OpenCV 之後,首先嚐試載入一張最簡單的圖片並顯示出來,程式碼示例: 第一種方式使用cv2.cv的LoadImage、ShowImage和SaveImage函式 import cv2.cv as cv # 讀圖片 image=cv.LoadImage('img

Python-OpenCV 處理影象:基本操作

0x00. 圖片讀、寫和顯示操作 安裝好 OpenCV 之後,首先嚐試載入一張最簡單的圖片並顯示出來,程式碼示例: 第一種方式使用cv2.cv的LoadImage、ShowImage和SaveImage函式 import cv2.cv as cv # 讀圖片 image=

Python的併發處理並行執行多個互不相干的子程序

這是併發處理中最簡單的一種情況。應用場景當然也很簡單。一般會是這樣:通過傳遞不同的引數,讓同一個函式在同一時間內執行幾種不同的任務,達到多工並行的效果,提升吞吐量。 我們有這樣一個要求:分別往2個檔案中寫入百W級資料,在序列狀態下的指令碼是這樣的: 【code-1】 import time '

Java EE專案中的異常處理總結篇不得不看的文章

什麼是異常?執行時發生的可被捕獲和處理的錯誤。這篇文章主要介紹了Java EE專案中的異常處理總結,有需要的可以瞭解一下。 為什麼要在J2EE專案中談異常處理呢?可能許多java初學者都想說:“異常處理不就是try….catch…finally嗎?這誰都會啊!”。筆者在

Python 接口測試

blog 系統環境變量 resp 環境變量 nbsp 們的 www nload uic 1. 概念: 接口測試是測試系統組件間接口的一種測試。接口測試主要用於檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換,傳遞和控制管理過程,以及系統間的

python初步——基礎總結

python 自動化運維一. 第一個HelloWorld 1. 在linux 執行 (python2.7)[[email protected]/* */ ~]# vim test.py #!/usr/bin/env python

python全棧測試題

span hello sdi 執行 python腳本 pan 數字 ice 登錄 1、執行Python腳本的兩種方式 如果想要永久保存代碼,就要用文件的方式 如果想要調試代碼,就要用交互式的方式即終端命令下和python環境中 2、Pyhton單行註釋和多行註釋分別用什

python進階學習

分享 target for buffer yun lena hello pri true 同樣是《python基礎教程(第二版)》的內容,只是後面內容學起來,相比前面會比較有趣,也更加實用,所以,將“基礎”改為“進階”。 python 電子書分享地址:http://yu

Python開發MapReduce系列WordCount Demo

logs 3-9 line counter ota python開發 home num brush  原創,轉發請註明出處。   MapReduce是hadoop這只大象的核心,Hadoop 中,數據處理核心就是 MapReduce 程序設計模型。一個Map/Reduc

python進階學習--多線程編程

不用 才會 睡眠 關鍵字參數 war 信息 target 函數傳遞 消息隊列 1. 多線程 概念:簡單地說操作系統可以同時執行多個不用程序。例如:一邊用瀏覽器上網,一邊在聽音樂,一邊在用筆記軟件記筆記。 並發:指的是任務數多余cpu核數,通過操作系統的各種任務調度算

Python爬蟲實例爬取百度貼吧帖子中的圖片

選擇 圖片查看 負責 targe mpat wid agent html headers 程序功能說明:爬取百度貼吧帖子中的圖片,用戶輸入貼吧名稱和要爬取的起始和終止頁數即可進行爬取。 思路分析: 一、指定貼吧url的獲取 例如我們進入秦時明月吧,提取並分析其有效url如下

Python操作rabbitmq系列

targe 紅色 入門 web 之間 cap ssa 隊列 技術 從本文開始,接下來的內容,我們將討論rabbitmq的相關功能。我的這些文章,最終是要實現一個項目(具體是什麽暫不透露)。前面每一篇,都是在為這個系統做準備。rabbitmq,是我們這個項目的關鍵部分之一。所

Python數據結構 字典

字典0x 01 字典簡介 子典和列表是python中最常用的兩種數據類型,字典是鍵值對(key-value)格式的數據類型,它和列表一樣也有索引,但不是列表中的下標,而是使用key來作為索引,key所對應的值就是value,所以字典是無序的,因此任何時候只要訪問字典的key,便可以得到對應的value,

Python學習之day5字符串常用操作命令簡介

堅持就是勝利 字符串常用操作命令簡介名字描述舉例.isdigit判斷是否是數字Name=demonlg,print name.isdigit,會打印出False,因為demonlg不是數字.inde

[讀書筆記] Python數據分析 準備工作

基礎 htm 環境 防止 功能 多維 處理工具 ati 增強 1. python中數據結構:矩陣,數組,數據框,通過關鍵列相互聯系的多個表(SQL主鍵,外鍵),時間序列 2. python 解釋型語言,程序員時間和CPU時間衡量,高頻交易系統 3. 全局解釋器鎖GIL,