異常處理與除錯
錯誤
•
有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字元
串,這種錯誤我們通常稱之為 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的庫,以處理伺