1. 程式人生 > >異常處理與除錯

異常處理與除錯

錯誤
•   有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字元
串,這種錯誤我們通常稱之為 bug,bug 是必須修復的。
  •   有的錯誤是使用者輸入造成的,比如讓使用者輸入 email 地址,結果得到一個空字
符串,這種錯誤可以通過檢查使用者輸入來做相應的處理。
  •   還有一類錯誤是完全無法在程式執行過程中預測的,比如寫入檔案的時候,磁碟
滿了,寫不進去了,這類錯誤也稱為異常,在程式中通常是必須處理的,否則,程式會
因為各種問題終止並退出。

常見的錯誤:

變數名錯誤
In [1]: print a
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-9d7b17ad5387> in <module>()
----> 1 print a

NameError: name 'a' is not defined

除數錯誤

In [1]: 10/2
Out[1]: 5

In [2]: 10/0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-2-242277fd9e32> in <module>()
----> 1 10/0

ZeroDivisionError: integer division or modulo by zero

檔案不存在

In [4]: open('njdka')
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-4-f3788830ea03> in <module>()
----> 1 open('njdka')

IOError: [Errno 2] No such file or directory: 'njdka'

語法錯誤

In [5]: for i in [2122,4]
  File "<ipython-input-5-c4042845e8a7>", line 1
    for i in [2122,4]
                     ^
SyntaxError: invalid syntax

索引錯誤,越界
In [6]: a = [31,3,5,5]
In [7]: a[4]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-7-54d383a36828> in <module>()
----> 1 a[4]

IndexError: list index out of range

切片超出規定長度,預設為規定長度
In [8]: a[1:7]
Out[8]: [3, 5, 5]

key錯誤:key值不存在
In [9]: d = {'name':'pucca'}
In [12]: d['age']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-12-39d5d5cefe61> in <module>()
----> 1 d['age']

KeyError: 'age'

錯誤處理
• 在程式執行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤程式碼;

• Python語言通常都內建了一套 try...except...finally... 的錯誤處理機制

#!/usr/bin/env python
#coding:utf-8
__author__ = "lvah"
'''
@author:wangjiahuzo
@file:work1.py
@contact:[email protected]
@time:7/15/179:00 AM
@desc:
'''
try:             # 把可能出現異常的程式碼放在該語句塊中
    print 'starting ......'
    li = [1,2,3]
    dic = {"name":'fentiao'}
    print dic
    print dic['age']
    print dic
    print a        #NameError
    print li[3]
except  BaseException,e:
    print '%s is error' %e
# except  IndexError,e:      # 捕獲指定的異常,如果異常IndexError,則執行下面語句
#     print e
# except NameError as e:
#     print e
else:                       # 如果沒有任何異常被捕獲,則執行該程式碼塊
    print 'no error'

finally:                    # 不管是否有異常,一定會執行的程式碼塊
    print 'end.........'
注:

- 用 try 來執行可能會出錯的程式碼;
- 如果執行正確,則except 語句塊不會執行;
- 如果執行錯誤,直接跳轉至錯誤處理程式碼,即except語句塊;
- 如果有 finally 語句塊,不管try語句塊內容是否正確,都會執行 finally
語句塊
• 錯誤有很多種類,如果發生了不同型別的錯誤,應該由不同的 except語句
塊處理。因此可以有多個 except 來捕獲不同型別的錯誤。

try:
    print 'start..........'
    li = [1,2,3]
    print li[3]
    print a
    dic = {'name': 'pucca'}
    print dic['age']

except BaseException,e:    #捕獲異常的父類,將錯誤賦給一個變數,捕獲第一個出現的錯誤
    print '%s is error' %e
else:
    print 'no error'      
finally:
    print 'end..........'
'''
注:
• Python 的錯誤其實也是 class,所有的錯誤型別都繼承自BaseException;
• 在使用except 捕獲該型別的錯誤,還把其子類也“一網打盡”;
def fun1(s):
    return  fun2(s)*2
def fun2(s):
    return 10/s      #int(s)
def main():
    try:
        print fun1('10')
    except TypeError,e:
        print e
main()

解讀錯誤資訊是定位錯誤的關鍵。我們從上往下可以看到整個錯誤的呼叫函式
鏈。

記錄錯誤
• 不捕獲錯誤,Python 直譯器會打印出錯誤資訊,但程式也被結束;
• 捕獲錯誤,就可以把錯誤資訊打印出來,然後分析錯誤原因,同時,讓程
序繼續執行下去。
• Python 內建的 logging 模組可以記錄錯誤資訊。
logging.exception(e)

import logging     #匯入模組記錄錯誤資訊
logging.basicConfig(filename='err.log')

def fun1(s):
    return  fun2(s)*2
def fun2(s):
    return 10/int(s)    
def main():
    try:
        print fun1('0')
    except Exception  as e:
        logging.exception(e)
main()
記錄錯誤資訊到檔案中:
ERROR:root:integer division or modulo by zero
Traceback (most recent call last):
  File "/root/PycharmProjects/123/7.15/work1.py", line 68, in main
    print fun1('0')
  File "/root/PycharmProjects/123/7.15/work1.py", line 63, in fun1
    return  fun2(s)*2
  File "/root/PycharmProjects/123/7.15/work1.py", line 65, in fun2
    return 10/int(s)     #int(s)
ZeroDivisionError: integer division or modulo by zero     #錯誤的根源

自定義的類:

class MyError(BaseException):
    pass

import logging
logging.basicConfig(filename='err.log')

def fun1(s):
    return  fun2(s)*2
def fun2(s):
    return 10/int(s)     #int(s)
def main():
    try:
        print fun1('0')
    except ZeroDivisionError  as e:
        raise MyError
                                  # 將ZeroDivisionError 轉換為了 MyError,矛盾的做法,避免嘗試
main()
丟擲錯誤
• 錯誤是 class,捕獲一個錯誤就是捕獲到該 class 的一個例項;
• Python 的內建函式會丟擲很多型別的錯誤,我們自己編寫的函式也
可以丟擲錯誤。
• 可以定義一個錯誤的 class,選擇好繼承關係,然後,用raise 語句丟擲
一個錯誤的例項;
• 儘量使用 Python 內建的錯誤型別
a = 1
if a == 1:
    raise NameError,'a==1'        #丟擲NameError異常


class MyError(BaseException):
    pass
a = 1
if a == 1:
    raise MyError('a==1')  #或是raise MyError,'a==1'  #自定義的錯誤丟擲
'''

除錯- print
      第一種方法簡單直接粗暴有效,就是用 print 把可能有問題的變數打印出來看
看。用 print 最大的壞處是將來還得刪掉它,執行結果也會包含很多垃圾資訊。

- print 列印你認為可能出錯的變數

除錯- 斷言
• 凡是用 print 來輔助檢視的地方,都可以用斷言(assert)來替代:;
• 如果斷言失敗, assert 語句本身就會丟擲 AssertionError

• Python 直譯器執行時可以用 -O 引數來關閉 assert,把所有的 assert 語句
當成 pass。

- assert 斷言, 格式
        assert 變數名==值[“不符合預設條件時,輸出的內容”]
        assert func(x)==值[,'不符合預設條件時,輸出的內容']

def foo(s):
    n = int(s)
    return 10 / n
def main():
    foo('0')
assert foo(5) == 1,'error'    
print 'hello'
[[email protected] 7.15]# python work1.py      #除錯
Traceback (most recent call last):
  File "work1.py", line 112, in <module>
    assert foo(5) == 1,'error'                 
AssertionError: error
[[email protected] 7.15]# python  -O work1.py  #關閉斷言,把所有的assrt語句當成pass,print輸出hello
hello

除錯- logging
• logging 不會丟擲錯誤,而且可以輸出到檔案;
• logging.info() 就可以輸出一段文字到日誌檔案中。
• logging.basicConfig(level=logging.INFO)指定記錄資訊的級別,有
debug , info , warning , error等幾個級別。
import logging    #匯入logging模組,記錄資訊
logging.basicConfig(filename='logging.log',level=logging.WARNING)
def foo(s):
    # debug ,info ,warning ,error     ##記錄資訊的級別,由弱到強
    n = int(s)
    logging.info('n=%d' % n)          #由於級別低於warning,未能記錄到資訊
    logging.warning('n=%d ...warn ' % n)
    return 10 / n
def main():
    foo('0')
main()
記錄錯誤資訊到日誌檔案中:
WARNING:root:n=0 ...warn 
除錯- pdb
•pdb
pdb讓程式以單步方式執行,隨時檢視執行狀態。n 可以單步執行代
碼,p 變數名 來檢視變數,q 結束除錯,退出程式。
def func():
    n = 1
    print n
func()
s = 2

#在terminal中除錯:
python -m pdb work1.py  按n一步一步執行
等程式執行到變數賦值完成後,p n /p s 取出變數,變數n取不出

•pdb.set_trace
在可能出錯的地方放一個 pdb.set_trace() ,就可以設定一個斷點。程
序會自動在 pdb.set_trace() 暫停並進入 pdb 除錯環境, p 檢視變數, c 繼續運
行。
import pdb
n1 = 1
n = int(n1)
print n
pdb.set_trace()     #設定斷點,執行到此顯示下條語句,按c繼續執行從下條語句開始
print 'world'
pdb.set_trace()
print 'hello'
s = 2
print s
 # 在terminal中除錯,python work1.py      按c繼續執行


相關推薦

python-異常處理除錯

一、常見的異常 出現錯誤的原因: •有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字串,這種錯誤我們通常稱之為 bug,bug 是必須修復的。 •有的錯誤是使用者輸入造成的,比如讓使用者輸入 email 地址,結果得到一個空字串,這種錯誤可

python異常處理除錯,正則表示式

####異常處理與除錯#### 1.cacl包裡沒加if __name__ == "__main__":時,hell.py在呼叫mun中的方法時,會執行mun中的print,加了之後則沒有。 2.錯誤 •有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字元

異常處理除錯

錯誤 •   有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字元 串,這種錯誤我們通常稱之為 bug,bug 是必須修復的。  •   有的錯誤是使用者輸入造成的,比如讓使用者輸入 email 地址,結果得到一個空字 符串,這種錯誤可以通過檢查使用者輸入來做

第9章 異常處理程式除錯

本章知識點: 1、try...except語句;2、raise語句;3、assert語句;4、自定義異常;5、程式除錯; 內容: 9.1 異常的處理 9.1.1 Python中的異常        

Python-異常處理調試

python 異常處理與調試一.錯誤1.有的錯誤是程序編寫有問題造成的,比如本來應該輸出整數結果輸出了字符串,這種錯誤我們通常稱之為 bug,bug 是必須修復的。2.有的錯誤是用戶輸入造成的,比如讓用戶輸入 email 地址,結果得到一個空字符串,這種錯誤可以通過檢查用戶輸入來做相應的處理。3.還有一類錯誤

異常處理內建模塊

得到 代碼塊 結果 ict min enc nbsp AS from 一、異常處理 1.1、異常常用格式 try:      #try接代碼塊,如果代碼正常則不執行except塊 print(2/0)except Exception as e:   #except捕

win0環異常處理Object-Hook

loading reac wpa nts procedure address create eric sep 0環下沒有veh有seh #include <ntifs.h> VOID DriverUnload(PDRIVER_OBJECT pDriver);

異常處理網絡基礎中的tcp,udp協議

server 數據 ati exc mac地址 成功 soc 不可靠 處理 # 異常處理: # 什麽是異常?異常和錯誤的區別 # Error 語法錯誤 比較明顯的錯誤 在編譯代碼階段就能檢測出來 # Iteration 異常 在執行代碼的過程中引發

Java異常處理詳解問題合集

Java異常處理與詳解  作者:華 日期:2018年5月30日 一次考試考到Java自定義異常,沒有做出來,只是簡單地瞭解了一下,為了鞏固知識,就從各大網站總結了關於Java異常的處理解釋來加深自己的印象。(全部文字雖有雷同但都是親自手打無複製) Java異常的意義: 異

JS錯誤處理除錯

try{ window.someNonexistentFunction(); }catch(error){ console.log(error.message); } 錯誤物件的message屬性。 自己在做了一個例子。 try{ (function(){

異常處理MiniDump詳解 1 C++異常

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

跟我學Flask(五)-異常處理請求鉤子

在開始講解異常處理之前,先科普一下常見的狀態碼 一、網站常見狀態碼 Type Reason-phrase Note 1XX Informational 資訊性狀態碼,表

Spring Boot 全域性異常處理 Hibernate Validator校驗框架整合

Hibernate Validator校驗框架的使用 Spring boot已經集成了hibernate-validator,不需要引入maven,其他框架也可以自己引入: <dependency> <groupId>org.h

urlib常見異常處理url解析

一.urlib異常處理 1、URLError異常 通常引起URLError的原因是:無網路連線(沒有到目標伺服器的路由)、訪問的目標伺服器不存在。在這種情況下,異常物件會有reason屬性(是一個(錯誤碼、錯誤原因)的元組) 1)訪問成功時: from

異常處理MiniDump詳解 4 MiniDump

程式崩潰的問題解決了,問題是,有很多時候,很多程式是不允許隨便崩潰的,這樣,在程式崩潰後再去發現問題就有些晚了,那麼,有沒有程式不崩潰時也能發現問題的方法呢?前面描述的SEH就是一種讓程式不崩潰的方法,不過在那種方式下,按以前描述的方法,崩潰是不崩潰了,但是實際上,掩蓋了很多問題,對於問題的發現有些不利的地方

《Javascript 高階程式設計(第三版)》筆記0x1E 錯誤處理除錯

目錄 瀏覽器報告的錯誤 錯誤處理     try-catch語句         finally 子句         錯誤型別      

異常處理斷言

1、異常與錯誤     錯誤 分為語法錯誤,邏輯錯誤;語法錯誤過不了python的直譯器,不符合python語言的規則,邏輯錯誤可通過直譯器,但是輸出錯誤 ----------------->語法錯誤 1 def test() 2 pass 3 —————————— 4 File

Springboot的異常處理自定義異常

園友們好,元旦很快就到來了,提前祝各位園友們元旦快樂,今天給大家分享一個工作中必用一個知識點,就是使用列舉構建自定義異常並應用於springboot的異常處理器。開始之前我先把這個案例的結構大致說明一下: 1、使用idea建立一個springboot的Gradle/Maven專案,引入web模組即可(由於案

Java程式設計中Springboot的異常處理自定義異常處理教程

元旦很快就到來了,提前祝各位元旦快樂,今天給大家分享一個工作中必用一個知識點,就是在Java開發中使用列舉構建自定義異常並應用於springboot的異常處理器。 開始之前我先把這個案例的結構大致說明一下: 1、使用idea建立一個springboot的Gradle/Maven專案,引入we

異常處理MiniDump詳解【轉帖】

(1) C++異常 一、   綜述 我很少敢為自己寫的東西弄個詳解的標題,之所以這次敢於這樣,自然還算是有點底氣的。並且也以此為動力,督促自己好好的將這兩個東西研究透。 當年剛開始工作的時候,第一個工作就是學習breakpad的原始碼,然後瞭解其原理,為公司寫一個ExceptionHandle的庫,以處理伺