亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3使用中有哪些錯誤和異常

發布時間:2022-01-24 16:07:51 來源:億速云 閱讀:154 作者:zzz 欄目:開發技術

這篇文章主要講解了“Python3使用中有哪些錯誤和異常”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python3使用中有哪些錯誤和異常”吧!

Python3使用中有哪些錯誤和異常

語法錯誤

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 語句。 Python3使用中有哪些錯誤和異常 以下例子中,讓用戶輸入一個合法的整數,但是允許用戶中斷這個程序(使用 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 子句沒有發生任何異常的時候執行。 Python3使用中有哪些錯誤和異常

以下實例在 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 語句無論是否發生異常都將執行最后的代碼。 Python3使用中有哪些錯誤和異常 以下實例中 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]]]

Python3使用中有哪些錯誤和異常 以下實例如果 x 大于 5 就觸發異常:

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

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

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

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):
 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使用中有哪些錯誤和異常”的內容了,經過本文的學習后,相信大家對Python3使用中有哪些錯誤和異常這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洞头县| 广州市| 墨江| 铜陵市| 会泽县| 峨眉山市| 西宁市| 武汉市| 门源| 丰原市| 德化县| 岐山县| 高安市| 贡山| 察哈| 宝应县| 浦江县| 拜泉县| 汶川县| 白银市| 安吉县| 西丰县| 余江县| 盘山县| 怀仁县| 临夏市| 许昌县| 东山县| 额济纳旗| 通辽市| 丰都县| 庆云县| 故城县| 安岳县| 安福县| 南投市| 安乡县| 射阳县| 神农架林区| 盐城市| 富民县|