python判斷正確錯誤_python錯誤和異常

Python3 錯誤和異常

作為 Python 初學者,在剛學習 Python 編程時,經常會看到一些報錯信息,在前面我們沒有提及,這章節我們會專門介紹。

Python 有兩種錯誤很容易辨認:語法錯誤和異常。

Python assert(斷言)用于判斷一個表達式,在表達式條件為 false 的時候觸發異常。

語法錯誤

Python 的語法錯誤或者稱之為解析錯,是初學者經常碰到的,如下實例

>>>while True print('Hello world')

File "", line 1, in ?

while True print('Hello world')

^

SyntaxError: invalid syntax

這個例子中,函數 print() 被檢查到有錯誤,是它前面缺少了一個冒號 : 。

語法分析器指出了出錯的一行,并且在最先找到的錯誤的位置標記了一個小小的箭頭。

異常

即便 Python 程序的語法是正確的,在運行它的時候,也有可能發生錯誤。運行期檢測到的錯誤被稱為異常。

大多數的異常都不會被程序處理,都以錯誤信息的形式展現在這里:

>>>10 * (1/0) # 0 不能作為除數,觸發異常

Traceback (most recent call last):

File "", line 1, in ?

ZeroDivisionError: division by zero

>>> 4 + spam*3 # spam 未定義,觸發異常

Traceback (most recent call last):

File "", line 1, in ?

NameError: name 'spam' is not defined

>>> '2' + 2 # int 不能與 str 相加,觸發異常

Traceback (most recent call last):

File "", line 1, in ?

TypeError: Can't convert 'int' object to str implicitly

異常以不同的類型出現,這些類型都作為信息的一部分打印出來: 例子中的類型有 ZeroDivisionError,NameError 和 TypeError。

錯誤信息的前面部分顯示了異常發生的上下文,并以調用棧的形式顯示具體信息。

異常處理

try/except

異常捕捉可以使用 try/except 語句。

以下例子中,讓用戶輸入一個合法的整數,但是允許用戶中斷這個程序(使用 Control-C 或者操作系統提供的方法)。用戶中斷的信息會引發一個 KeyboardInterrupt 異常。

while True:

try:

x = int(input("請輸入一個數字: "))

break

except ValueError:

print("您輸入的不是數字,請再次嘗試輸入!")

try 語句按照如下方式工作;

首先,執行 try 子句(在關鍵字 try 和關鍵字 except 之間的語句)。

如果沒有異常發生,忽略 except 子句,try 子句執行后結束。

如果在執行 try 子句的過程中發生了異常,那么 try 子句余下的部分將被忽略。如果異常的類型和 except 之后的名稱相符,那么對應的 except 子句將被執行。

如果一個異常沒有與任何的 excep 匹配,那么這個異常將會傳遞給上層的 try 中。

一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多只有一個分支會被執行。

處理程序將只針對對應的 try 子句中的異常進行處理,而不是其他的 try 的處理程序中的異常。

一個except子句可以同時處理多個異常,這些異常將被放在一個括號里成為一個元組,例如:

except (RuntimeError, TypeError, NameError):

pass

最后一個except子句可以忽略異常的名稱,它將被當作通配符使用。你可以使用這種方法打印一個錯誤信息,然后再次把異常拋出。

import sys

try:

f = open('myfile.txt')

s = f.readline()

i = int(s.strip())

except OSError as err:

print("OS error: {0}".format(err))

except ValueError:

print("Could not convert data to an integer.")

except:

print("Unexpected error:", sys.exc_info()[0])

raise

try/except...else

try/except 語句還有一個可選的 else 子句,如果使用這個子句,那么必須放在所有的 except 子句之后。

else 子句將在 try 子句沒有發生任何異常的時候執行。

以下實例在 try 語句中判斷文件是否可以打開,如果打開文件時正常的沒有發生異常則執行 else 部分的語句,讀取文件內容:

沒發生異常就關閉啊,沒發生異常就輸出啊 這是列子

for arg in sys.argv[1:]:

try:

f = open(arg, 'r')

except IOError:

print('cannot open', arg)

else:

print(arg, 'has', len(f.readlines()), 'lines')

f.close()

使用 else 子句比把所有的語句都放在 try 子句里面要好,這樣可以避免一些意想不到,而 except 又無法捕獲的異常。

異常處理并不僅僅處理那些直接發生在 try 子句中的異常,而且還能處理子句中調用的函數(甚至間接調用的函數)里拋出的異常。例如:

>>>def this_fails():

x = 1/0

>>> try:

this_fails()

except ZeroDivisionError as err:

print('Handling run-time error:', err)

Handling run-time error: int division or modulo by zero

try-finally 語句

try-finally 語句無論是否發生異常都將執行最后的代碼。

以下實例中 finally 語句無論異常是否發生都會執行:

實例

try:

runoob()

except AssertionError as error:

print(error)

else:

try:

with open('file.log') as file:

read_data = file.read()

except FileNotFoundError as fnf_error:

print(fnf_error)

finally:

print('這句話,無論異常是否發生都會執行。')

拋出異常

Python 使用 raise 語句拋出一個指定的異常。

raise語法格式如下:

raise [Exception [, args [, traceback]]]

以下實例如果 x 大于 5 就觸發異常:

x = 10

if x > 5:

raise Exception('x 不能大于 5。x 的值為: {}'.format(x))

執行以上代碼會觸發異常:

Traceback (most recent call last):

File "test.py", line 3, in

raise Exception('x 不能大于 5。x 的值為: {}'.format(x))

Exception: x 不能大于 5。x 的值為: 10

raise 唯一的一個參數指定了要被拋出的異常。它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。

如果你只想知道這是否拋出了一個異常,并不想去處理它,那么一個簡單的 raise 語句就可以再次把它拋出。

>>>try:

raise NameError('HiThere')

except NameError:

print('An exception flew by!')

raise

An exception flew by!

Traceback (most recent call last):

File "", line 2, in ?

NameError: HiThere

用戶自定義異常

你可以通過創建一個新的異常類來擁有自己的異常。異常類繼承自 Exception 類,可以直接繼承,或者間接繼承,例如:

>>>class MyError(Exception):

def __init__(self, value):

self.value = value

def __str__(self):

return repr(self.value)

>>> try:

raise MyError(2*2)

except MyError as e:

print('My exception occurred, value:', e.value)

My exception occurred, value: 4

>>> raise MyError('oops!')

Traceback (most recent call last):

File "", line 1, in ?

__main__.MyError: 'oops!'

在這個例子中,類 Exception 默認的 __init__() 被覆蓋。

當創建一個模塊有可能拋出多種不同的異常時,一種通常的做法是為這個包建立一個基礎異常類,然后基于這個基礎類為不同的錯誤情況創建不同的子類:

class Error(Exception):

"""Base class for exceptions in this module."""

pass

class InputError(Error):

"""Exception raised for errors in the input.

Attributes:

expression -- input expression in which the error occurred

message -- explanation of the error

"""

def __init__(self, expression, message):

self.expression = expression

self.message = message

class TransitionError(Error):

"""Raised when an operation attempts a state transition that's not

allowed.

Attributes:

previous -- state at beginning of transition

next -- attempted new state

message -- explanation of why the specific transition is not allowed

"""

def __init__(self, previous, next, message):

self.previous = previous

self.next = next

self.message = message

大多數的異常的名字都以"Error"結尾,就跟標準的異常命名一樣。

定義清理行為

try 語句還有另外一個可選的子句,它定義了無論在任何情況下都會執行的清理行為。 例如:

>>>try:

... raise KeyboardInterrupt

... finally:

... print('Goodbye, world!')

...

Goodbye, world!

Traceback (most recent call last):

File "", line 2, in

KeyboardInterrupt

以上例子不管 try 子句里面有沒有發生異常,finally 子句都會執行。

如果一個異常在 try 子句里(或者在 except 和 else 子句里)被拋出,而又沒有任何的 except 把它截住,那么這個異常會在 finally 子句執行后被拋出。

下面是一個更加復雜的例子(在同一個 try 語句里包含 except 和 finally 子句):

>>>def divide(x, y):

try:

result = x / y

except ZeroDivisionError:

print("division by zero!")

else:

print("result is", result)

finally:

print("executing finally clause")

>>> divide(2, 1)

result is 2.0

executing finally clause

>>> divide(2, 0)

division by zero!

executing finally clause

>>> divide("2", "1")

executing finally clause

Traceback (most recent call last): #那么這個異常會在 finally 子句執行后被拋出

File "", line 1, in ?

File "", line 3, in divide

TypeError: unsupported operand type(s) for /: 'str' and 'str'

預定義的清理行為

一些對象定義了標準的清理行為,無論系統是否成功的使用了它,一旦不需要它了,那么這個標準的清理行為就會執行。

這面這個例子展示了嘗試打開一個文件,然后把內容打印到屏幕上:

for line in open("myfile.txt"):

print(line, end="")

以上這段代碼的問題是,當執行完畢后,文件會保持打開狀態,并沒有被關閉。

關鍵詞 with 語句就可以保證諸如文件之類的對象在使用完之后一定會正確的執行他的清理方法:

with open("myfile.txt") as f:

for line in f:

print(line, end="")

以上這段代碼執行完畢后,就算在處理過程中出問題了,文件 f 總是會關閉。

Python3 assert(斷言)

Document 對象參考手冊 Python3 錯誤和異常

Python assert(斷言)用于判斷一個表達式,在表達式條件為 false 的時候觸發異常。

斷言可以在條件不滿足程序運行的情況下直接返回錯誤,而不必等待程序運行后出現崩潰的情況,例如我們的代碼只能在 Linux 系統下運行,可以先判斷當前系統是否符合條件。

語法格式如下:

assert expression

等價于:

if not expression:

raise AssertionError

assert 后面也可以緊跟參數:

assert expression [, arguments]

等價于:

if not expression:

raise AssertionError(arguments)

以下為 assert 使用實例:

>>> assert True # 條件為 true 正常執行

>>> assert False # 條件為 false 觸發異常

Traceback (most recent call last):

File "", line 1, in

AssertionError

>>> assert 1==1 # 條件為 true 正常執行

>>> assert 1==2 # 條件為 false 觸發異常

Traceback (most recent call last):

File "", line 1, in

AssertionError

>>> assert 1==2, '1 不等于 2'

Traceback (most recent call last):

File "", line 1, in

AssertionError: 1 不等于 2

>>>

以下實例判斷當前系統是否為 Linux,如果不滿足條件則直接觸發異常,不必執行接下來的代碼:

實例

import sys

assert ('linux' in sys.platform), "該代碼只能在 Linux 下執行"

# 接下來要執行的代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534970.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534970.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534970.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nodejs mysql 返回json_python向mysql中存儲JSON及Nodejs取出

雖然把JSON數據存入mysql也是比較蛋疼,但是相比使用Nodejs嵌套處理多個mysql查詢并拼接返回數據也算是沒mongo時的一個折中方案了。我使用python拼接了一個json格式的字符串,卻遇到了一些問題1,如果把json數據轉成str存入,那么nod…

17個常用經典數據可視化圖表與冷門圖表

數據可視化是創建信息圖形表示的過程。隨著可視化技術的飛速發展,可以利用強大的可視化工具選擇合適的數據可視化圖表來展示數據。以下專業人士都應該知道的一些最重要的數據可視化圖表。 常見數據可視化圖表 餅圖 餅圖是最常見和最基本的數據可視化圖表之一。餅圖…

python keyerror_盤點Python 初學者最容易犯的10大錯誤!你中招了嗎?

對于新手,初學Python時,總會遇到這樣那樣的報錯,想要弄懂Python錯誤信息的含義可能還不知道怎么做,這里列出了一些比較常見的Python報錯問題,希望對于學習Python的人能夠有些幫助。發現有很多想要學習Python卻不知道如…

mysql index sub part_mysql中的key和index 理解

mysql的key和index多少有點令人迷惑,這實際上考察對數據庫體系結構的了解的。1 key 是數據庫的物理結構,它包含兩層意義,一是約束(偏重于約束和規范數據庫的結構完整性),二是索引(輔助查詢用的)。包括primary key, unique key, fo…

【spring cloud】(六)消息總線——springcloud Bus

各位小伙伴們大家好,歡迎來到這個小扎扎的spring cloud專欄,在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛ 💡Bus…

python快速排序代碼_Python實現快速排序算法

原標題:Python實現快速排序算法 Python實現快速排序算法 快速排序算法是一種基于交換的高效的排序算法,由C.R.A.Hoare于1962年提出,是一種劃分交換排序。它采用了一種分治的策略,通常稱其為分治法(Divide and conquer algorithm)。…

docker mysql 生產環境_如何部署Docker MySQL生產環境?

1 前言Docker容器原則上是短暫的,如果容器被刪除或損毀,數據或配置將丟失,所以上個章節部署的MySQL只適合于測試環境,由于生產的需求,本章將使用Docker卷機制持久保存Docker容器中創建的數據。2 最佳實踐2.1 環境配置2…

kali 切換root權限_Ubuntu 被曝嚴重漏洞:切換系統語言 + 輸入幾行命令,就能獲取 root 權限...

公眾號關注 “GitHubDaily”設為 “星標”,帶你了解技術圈內新鮮事!來自量子位無需系統密碼,就能添加新的 sudo 用戶、獲取 root 權限,事后還能刪除不留痕跡。這是 GitHub 安全研究員 Kevin Backhouse 發現的一個 Ubuntu 系統大漏…

oracle定義變量sql賦值_ORACLE獲取SQL綁定變量值的方法總結

本文總結一下ORACLE數據庫中如何獲取SQL綁定變量值的方法,在SQL優化調優過程中,經常會用到這方面的知識點。在此梳理、總結一下這方面的知識點,方面日后查找、翻閱。方法1:查詢V$SQLV$SQL視圖中的BIND_DATA字段用來存儲綁定變量的…

transition css_Transition 過渡

1:基本概念在一定時間內平滑的過渡,也就是圓滑的以動畫效果改變css的屬性值。它的過渡可以由鼠標點擊、焦點獲取或者失去、被點擊事件或對元素的改變中觸發;不能主動觸發,只能被動觸發。常用的基本屬性有:Transition-d…

jdbc mysql分頁_JDBC【數據庫連接池、DbUtils框架、分頁】

1.數據庫連接池什么是數據庫連接池簡單來說:數據庫連接池就是提供連接的。。。為什么我們要使用數據庫連接池數據庫的連接的建立和關閉是非常消耗資源的頻繁地打開、關閉連接造成系統性能低下編寫連接池編寫連接池需實現java.sql.DataSource接口創建批量的Connectio…

python讀寫文件操作_詳解Python文件讀寫操作

讀文件 打開文件(文件需要存在)#打開文件 f open("data.txt","r") #設置文件對象 print(f)#文件句柄 f.close() #關閉文件 #為了方便,避免忘記close掉這個文件對象,可以用下面這種方式替代 with open(data.t…

keyloadtool_phoenix 利用CsvBulkLoadTool 批量帶入數據并自動創建索引

需要先創建表:CREATE TABLE IF NOT EXISTS population (state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINTCONSTRAINT my_pk PRIMARY KEY (state, city));在phoenix 目錄下執行hadoop jar /home/phoenix-4.6.0-HBase-1.0-bin/phoenix-4.6.0-HBase-…

【cloud Alibaba】(三)流量控制、熔斷降級(下)——Sentinel

各位小伙伴們大家好,歡迎來到這個小扎扎的spring cloud專欄,在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛ 💡Sen…

python gui入門的例子_Python GUI編程之Tkinter入門之道

相信剛學習使用Python進行GUI編程的時候,肯定都會聽過Tkinter,畢竟是standard Python interface to the Tk GUI toolkit.用來寫一些小程序還是很方便的。但如果是剛接觸GUI編程的話肯定是被官方文檔搞的有些懵,畢竟還沒弄清楚套路。之前使用過…

@async 默認線程池_SpringBoot 線程池的使用

Java大聯盟幫助萬千Java學習者持續成長關注作者|Musclehengblog.csdn.net/Muscleheng/article/details/81409672前言最近在做訂單模塊,用戶購買服務類產品之后,需要進行預約,預約成功之后分別給商家和用戶發送提醒短信。考慮發短信…

mysql 橫向擴展 中間件_mysql-proxy數據庫中間件架構 | 架構師之路

一、mysql-proxy簡介mysql-proxy是mysql官方提供的mysql中間件服務,上游可接入若干個mysql-client,后端可連接若干個mysql-server。它使用mysql協議,任何使用mysql-client的上游無需修改任何代碼,即可遷移至mysql-proxy上。mysql-…

python selenium對象怎么序列化_python selenium爬取斗魚

不加延遲報錯selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”.//span[class”DyListCover-hot”]”}(Session info: chrome80.0.3987.122)最開始以為是版本問題,不…

神經網絡的全連接層_深度神經網絡全連接層

一、概念全連接層一般在網絡的最后部分做分類輸出,全連接層的有m個輸入和n個輸出,每一個輸出都和所有的輸入相連,相連的權重w都是不一樣的,同時每一個輸出還有一個bias。二、前向全連接假設輸入是4,輸出是4&#xff0c…