成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

開發(fā) 后端
實(shí)際上在編程過程中,我們一樣會(huì)假定某段代碼某個(gè)功能可能會(huì)出現(xiàn)問題的方式來編寫我們的代碼。今天我們主要來講講Python語言的異常處理相關(guān)知識。

我曾經(jīng)幫很多人修過電腦,排除硬件問題、排除系統(tǒng)問題、網(wǎng)絡(luò)問題等等。

在修電腦的過程中比如電腦無法開機(jī),我就會(huì)假定它某個(gè)配件已經(jīng)壞掉了,就先從電源開始排查起、CPU、內(nèi)存、主板等等一個(gè)一個(gè)的測試,看看究竟是哪一個(gè)配件有問題。

如果操作系統(tǒng)系統(tǒng)速度變慢同樣也可以用類似的辦法,先看當(dāng)前占用進(jìn)程有沒有不必要啟動(dòng)的、是否有病毒、系統(tǒng)是否沒有優(yōu)化等等。

實(shí)際上在編程過程中,我們一樣會(huì)假定某段代碼某個(gè)功能可能會(huì)出現(xiàn)問題的方式來編寫我們的代碼。

今天我們主要來講講Python語言的異常處理相關(guān)知識。

異常捕獲

首先我們來看一個(gè)例子:

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

我通過 print(a) 讓Python解釋器給我報(bào)了一個(gè)異常,其中包含錯(cuò)誤信息的所有上下文信息,代碼路徑、錯(cuò)誤代碼內(nèi)容、錯(cuò)誤信息等等。

print(a)這個(gè)語句錯(cuò)誤的原因是在于a這個(gè)變量沒有定義 (NameError: name 'a' is not defined),這在我寫代碼之前就清楚。

然而在實(shí)際編程過程中,隨著代碼量的增加,我們有的時(shí)候并不確定某個(gè)變量是否已經(jīng)被賦值成功,如果變量未被成功的賦值,程序還是按原計(jì)劃對其進(jìn)行操作時(shí)可能就會(huì)直接報(bào)錯(cuò)。

要解決這個(gè)問題有兩個(gè)辦法:

  • 對變量進(jìn)行操作(例如加減法)之前檢查它的值是否已經(jīng)存在,如果不存在,就告訴用戶
  • 捕獲該異常,并且告訴用戶

這兩種辦法的結(jié)果其實(shí)都是會(huì)告訴用戶錯(cuò)誤信息,在結(jié)果上并沒有太大的變化,今天我們主要講第二種,異常自動(dòng)捕獲的方式。

現(xiàn)在我們改造一下剛才的代碼,把異常捕獲到然后自定義處理方式:

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

以上的代碼例子展示我們通過異常捕獲 try except的語法把錯(cuò)誤捕獲到,并且自定義了其輸出內(nèi)容。

讓我們來解釋一下這段代碼:

  • try用于定義一個(gè)異常捕獲的語法塊。
  • 在try縮進(jìn)的區(qū)塊里,我們可以正常寫我們想要實(shí)現(xiàn)的代碼。
  • 在except區(qū)塊里,我們定義了如果程序報(bào)錯(cuò)后所要執(zhí)行的代碼,在本例子中就是直接打印報(bào)錯(cuò)信息 (報(bào)錯(cuò)信息:name 'a' is not defined)。
  • except后面的Exception as e 的用處是用于定義錯(cuò)誤信息類型(Exception),并且將錯(cuò)誤信息賦值給變量e。

通過在代碼任意位置使用try...except語法,我們可以設(shè)置多個(gè)try...except的代碼塊,如果在try中程序正常執(zhí)行沒有報(bào)錯(cuò),那么程序就會(huì)跳過except區(qū)塊,正常執(zhí)行之后的代碼。

異常類型

我們剛才用到Exception這個(gè)異常類型,它在Python中是常規(guī)錯(cuò)誤的基類,如果我們對可能出錯(cuò)的類型不能確定時(shí)就可以使用到它,但是一般不建議這么做。

不直接使用Exception的理由是我們在捕獲到異常時(shí),總是希望能夠?qū)Ξ惓_M(jìn)行明確的報(bào)錯(cuò)或者處理,如果所有錯(cuò)誤都是Exception類型,我們其實(shí)也不知道程序究竟是在哪里出了錯(cuò)。

舉個(gè)例子來說明這個(gè)問題。

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

通過上面這個(gè)例子我們可以學(xué)到兩件事情:

  • except和try是一對多的,有一個(gè)try語句,可以有1個(gè)或多個(gè) except語句,其用處是定義任意個(gè)異常類型和相關(guān)的處理代碼
  • 當(dāng)異常捕獲發(fā)生后,程序會(huì)中斷執(zhí)行,停留在第一個(gè)異常報(bào)錯(cuò)的位置。在本例子中因?yàn)槲覀僫mport xxx實(shí)際上是引入了一個(gè)不存在的模塊名,所以程序報(bào)錯(cuò) No module named 'xxx',其錯(cuò)誤類型是ImportError

現(xiàn)在我們嘗試把import xxx去掉試試。

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

現(xiàn)在程序報(bào)了類型錯(cuò)誤(TypeError),因?yàn)閕nt類型的數(shù)據(jù)無法和str類型的數(shù)字進(jìn)行加法操作。

下面我給一個(gè)Python的常見異常錯(cuò)誤類型表,供大家參考。

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

主動(dòng)拋出異常

上面我們講到了Python如何被動(dòng)捕獲異常,現(xiàn)在我們來講講主動(dòng)拋出異常的方法。

為什么要主動(dòng)拋出異常?

通常我們通過try except捕獲的異常叫做被動(dòng)捕獲,它其實(shí)是需要程序員進(jìn)行處理的,比如對錯(cuò)誤的變量內(nèi)容做一些改正讓其繼續(xù)執(zhí)行。但是主動(dòng)拋出異常通常不需要再進(jìn)行處理,程序員已經(jīng)確定這個(gè)地方必須拋出異常給用戶,并且中斷程序執(zhí)行,基于這種情況下程序員就不用再對異常進(jìn)行處理了。

來看一個(gè)例子:

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

在這段代碼里,我們定義了a為一個(gè)整型的數(shù)字。

然后通過instance()內(nèi)部函數(shù)判斷a如果不是字符串類型的情況下,就通過raise語句主動(dòng)拋出一個(gè)異常,報(bào)錯(cuò)內(nèi)容也是我們自定義的,其作用就是直接告訴用戶,數(shù)據(jù)出錯(cuò)了。

有朋友會(huì)提一個(gè)問題,你自己定義的a = 1,它明明是整型數(shù)字,你還拿去判斷它是不是字符串,這不是多此一舉嗎?它是不是字符串你心里沒點(diǎn)數(shù)嗎?

沒錯(cuò),之所以你會(huì)有這個(gè)問題是因?yàn)槲覀兊睦犹唵危僭O(shè)變量a的內(nèi)容是來自于另一個(gè)模塊呢?或者是來自于爬蟲從網(wǎng)絡(luò)上抓取下來的數(shù)據(jù)?這個(gè)時(shí)候我們根本不知道a可能是什么內(nèi)容,那么就必須用到異常處理機(jī)制了。

raise的語法很簡單:

  1. raise [exceptionName [(reason)]] 

在它后面跟上想要拋出的異常類型即可,如果有必要寫上錯(cuò)誤內(nèi)容的話,就傳進(jìn)去:

  1. raise ValueError("a必須是字符串") 

另外raise語句其實(shí)也可以和 try except結(jié)合起來使用:

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

上面這個(gè)例子展現(xiàn)了程序如何主動(dòng)拋出異常,再由except捕獲并打印錯(cuò)誤信息。

自定義異常

其實(shí)我們剛才了解到所有異常錯(cuò)誤類型其實(shí)都是一個(gè)類 (class ),那么我們同樣可以自定義一個(gè)異常類,以便于在程序里使用。

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

通過以上的代碼例子:

  • 我們自定義了一個(gè)異常類,叫做CustomerError,繼承自BaseException這個(gè)Python異常錯(cuò)誤類型的基類
  • 然后定義其__init__方法,并用一個(gè)變量接受傳入的錯(cuò)誤信息。
  • __init__方法里可以什么都不做,用一個(gè)pass占位即可,因?yàn)镃ustomerError類是繼承自BaseException的,它天生具有BaseException的所有特性。
  • 最后我們拋出一個(gè)CustomerError異常,并傳了一個(gè)字符串內(nèi)容"自定義異常"進(jìn)去,由except 捕獲到這個(gè)異常并輸出異常內(nèi)容。

總結(jié)

通過自定義異常,我們可以不用拘泥于Python自帶的異常錯(cuò)誤類型,定義更多自己想要的錯(cuò)誤類型,精確的控制出錯(cuò)的時(shí)機(jī)和處理方式。

最后通過一個(gè)思維導(dǎo)圖來展示異常處理的相關(guān)知識點(diǎn)。

總結(jié)Python異常處理的三個(gè)重要知識點(diǎn)

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2024-09-19 16:00:01

網(wǎng)絡(luò)編程網(wǎng)絡(luò)Python

2022-08-16 15:17:37

機(jī)器學(xué)習(xí)算法模型

2017-12-08 14:26:19

Android面試知識點(diǎn)總結(jié)

2020-10-14 10:50:50

SpringSessiJavaweb

2010-08-18 10:52:46

Linux筆試

2023-03-16 15:13:41

缺失值據(jù)集中數(shù)據(jù)分析

2009-08-06 17:42:32

C#知識點(diǎn)

2010-06-17 16:42:04

UML

2019-10-24 09:09:28

MySQLACIDJava

2021-04-13 08:25:12

測試開發(fā)Java注解Spring

2020-07-01 17:25:28

Redis數(shù)據(jù)庫內(nèi)存

2022-07-20 00:15:48

SQL數(shù)據(jù)庫編程語言

2013-08-01 10:16:06

Linux

2016-12-21 09:55:55

面試JavaScrip總結(jié)

2014-06-10 13:44:58

iOSUIImage知識點(diǎn)

2021-01-07 05:27:20

包導(dǎo)入變量

2023-12-22 15:32:20

2021-04-19 08:35:44

PythonPython語言Python基礎(chǔ)

2020-09-25 16:52:57

Python

2020-12-24 13:32:31

大數(shù)據(jù)數(shù)據(jù)分析SQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 免费av毛片 | 亚州无限乱码 | 精品一区二区在线观看 | 特一级黄色毛片 | 国产成人精品久久二区二区91 | 午夜精品影院 | 国产视频在线观看一区二区三区 | 久久久精品一区 | 亚洲人成网亚洲欧洲无码 | 奇米久久久 | 精品亚洲国产成av人片传媒 | 久久不卡视频 | 精品欧美一区二区三区久久久 | 依人成人| 91亚洲国产成人精品一区二三 | 天天操天天摸天天爽 | 成人亚洲一区 | 久久一区二区三区四区五区 | 伊人伊人伊人 | 欧美在线一区二区三区四区 | 综合色影院 | 久草福利| 日韩精品一区二区三区中文在线 | 婷婷开心激情综合五月天 | 欧洲精品在线观看 | 日本免费一区二区三区视频 | 国产精品欧美一区二区 | 99久久精品国产一区二区三区 | 国产美女特级嫩嫩嫩bbb片 | 日韩成人影院 | 中国人pornoxxx麻豆 | 日韩精品成人一区二区三区视频 | 国产一区 | 自拍偷拍第一页 | 天堂av资源 | 欧美成人免费在线视频 | 超碰免费在线 | www.99re5.com| 在线综合视频 | 国产日韩久久久久69影院 | 日本精品视频在线 |