一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python 如何調(diào)試程序崩潰錯(cuò)誤

Python 如何調(diào)試程序崩潰錯(cuò)誤

2020-08-04 00:20David Beazley Python

這篇文章主要介紹了Python 如何調(diào)試程序崩潰錯(cuò)誤,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

問(wèn)題

你的程序崩潰后該怎樣去調(diào)試它?

解決方案

如果你的程序因?yàn)槟硞€(gè)異常而崩潰,運(yùn)行 python3 -i someprogram.py 可執(zhí)行簡(jiǎn)單的調(diào)試。 -i 選項(xiàng)可讓程序結(jié)束后打開一個(gè)交互式shell。 然后你就能查看環(huán)境,例如,假設(shè)你有下面的代碼:

?
1
2
3
4
5
6
# sample.py
 
def func(n):
  return n + 10
 
func('Hello')

運(yùn)行 python3 -i sample.py 會(huì)有類似如下的輸出:

?
1
2
3
4
5
6
7
8
9
10
bash % python3 -i sample.py
Traceback (most recent call last):
 File "sample.py", line 6, in <module>
  func('Hello')
 File "sample.py", line 4, in func
  return n + 10
TypeError: Can't convert 'int' object to str implicitly
>>> func(10)
20
>>>

如果你看不到上面這樣的,可以在程序崩潰后打開Python的調(diào)試器。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> import pdb
>>> pdb.pm()
> sample.py(4)func()
-> return n + 10
(Pdb) w
 sample.py(6)<module>()
-> func('Hello')
> sample.py(4)func()
-> return n + 10
(Pdb) print n
'Hello'
(Pdb) q
>>>

如果你的代碼所在的環(huán)境很難獲取交互shell(比如在某個(gè)服務(wù)器上面), 通常可以捕獲異常后自己打印跟蹤信息。例如:

?
1
2
3
4
5
6
7
8
import traceback
import sys
 
try:
  func(arg)
except:
  print('**** AN ERROR OCCURRED ****')
  traceback.print_exc(file=sys.stderr)

要是你的程序沒(méi)有崩潰,而只是產(chǎn)生了一些你看不懂的結(jié)果, 你在感興趣的地方插入一下 print() 語(yǔ)句也是個(gè)不錯(cuò)的選擇。 不過(guò),要是你打算這樣做,有一些小技巧可以幫助你。 首先,traceback.print_stack() 函數(shù)會(huì)你程序運(yùn)行到那個(gè)點(diǎn)的時(shí)候創(chuàng)建一個(gè)跟蹤棧。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> def sample(n):
...   if n > 0:
...       sample(n-1)
...   else:
...       traceback.print_stack(file=sys.stderr)
...
>>> sample(5)
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 5, in sample
>>>

另外,你還可以像下面這樣使用 pdb.set_trace() 在任何地方手動(dòng)的啟動(dòng)調(diào)試器:

?
1
2
3
4
5
6
import pdb
 
def func(arg):
  ...
  pdb.set_trace()
  ...

當(dāng)程序比較大而你想調(diào)試控制流程以及函數(shù)參數(shù)的時(shí)候這個(gè)就比較有用了。 例如,一旦調(diào)試器開始運(yùn)行,你就能夠使用 print 來(lái)觀測(cè)變量值或敲擊某個(gè)命令比如 w 來(lái)獲取追蹤信息。

討論

不要將調(diào)試弄的過(guò)于復(fù)雜化。一些簡(jiǎn)單的錯(cuò)誤只需要觀察程序堆棧信息就能知道了, 實(shí)際的錯(cuò)誤一般是堆棧的最后一行。 你在開發(fā)的時(shí)候,也可以在你需要調(diào)試的地方插入一下 print() 函數(shù)來(lái)診斷信息(只需要最后發(fā)布的時(shí)候刪除這些打印語(yǔ)句即可)。

調(diào)試器的一個(gè)常見用法是觀測(cè)某個(gè)已經(jīng)崩潰的函數(shù)中的變量。 知道怎樣在函數(shù)崩潰后進(jìn)入調(diào)試器是一個(gè)很有用的技能。

當(dāng)你想解剖一個(gè)非常復(fù)雜的程序,底層的控制邏輯你不是很清楚的時(shí)候, 插入 pdb.set_trace() 這樣的語(yǔ)句就很有用了。

實(shí)際上,程序會(huì)一直運(yùn)行到碰到 set_trace() 語(yǔ)句位置,然后立馬進(jìn)入調(diào)試器。 然后你就可以做更多的事了。

如果你使用IDE來(lái)做Python開發(fā),通常IDE都會(huì)提供自己的調(diào)試器來(lái)替代pdb。 更多這方面的信息可以參考你使用的IDE手冊(cè)。

以上就是Python 如何調(diào)試程序崩潰錯(cuò)誤的詳細(xì)內(nèi)容,更多關(guān)于Python調(diào)試程序崩潰錯(cuò)誤的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p12_debugging_basic_program_crashes.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美在线视频一区二区 | 91久| 国产激情视频 | 污小说h| 亚州笫一色惰网站 | 亚洲社区在线观看 | a级毛片毛片免费很很综合 a级黄色视屏 | 91精品乱码一区二区三区 | 日本性漫画 | 色999| 欧美三级小说 | 色综合久久天天综合 | 欧美日一级片 | 精品人伦一区二区三区潘金莲 | 明星乱亚洲| 草莓视频网站18勿进 | 国产成人yy精品1024在线 | 美国一级大黄大色毛片 | 国产九九视频在线观看 | 亚洲国产成人久久午夜 | 久久久久久88色偷偷 | 深夜福利免费在线观看 | 免费国产午夜高清在线视频 | 18韩国美女vip视频7 | 天天爱天天做天天爽天天躁 | 国产精品99久久 | 欧美日韩亚毛片免费观看 | 秋霞色| jux629三浦理惠子在线播放 | 日韩 国产 欧美 | 成人国产网站v片免费观看 成人国产精品视频 | 深夜影院深a久久 | 国产老太婆hd老头 | 欧亚专线欧洲m码可遇不可求 | 日本一卡二卡3卡四卡无卡网址 | 久久精品18| 亚洲精品国产成人 | 消息称老熟妇乱视频一区二区 | 久久久无码精品亚洲欧美 | 99re这里只有精品视频 | 深夜影院a|