亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python異常處理

系統 1969 0

在編寫計算機程序時,通常能夠區分正常和異常(不正常)情況。異常事件可能是錯誤(如試圖除以零),也可能是通常不會發生的事情。Python使用異常對象來表示異常狀態,并在遇到錯誤時引發異常。異常對象未被處理(或捕獲)時,程序將終止并顯示一條錯誤消息(traceback)。

            
              #試圖除以零的報錯
print(1/0)
# Traceback (most recent call last):
#     print(1/0)
#     ZeroDivisionError: division by zero
            
          

正如你所見,出現問題是,自動引發異常。要引發異常,可使用raise語句,并將一個類(必須是Exception的子類)或者實例作為參數,將類作為參數時,將自動創建一個實例。

            
              raise Exception
# Traceback (most recent call last):
#     raise Exception
# Exception
raise Exception("error occurred ")
# Traceback (most recent call last):
#     raise Exception("error occurred ")
# Exception: error occurred 
            
          

在第一個示例(raise Exception)中,引發的時通常異常,并沒有指出來出現了什么錯誤。在第二個示例中,添加了錯誤消息error occurred。 幾乎所有的異常類都是由Exception派生出來的。

常見類名 描述
KeyboardInterrupt 用戶中斷執行(通常是輸入Ctrl+C)
ArithmeticError 引用屬性或給它賦值失敗時引發
ZeroDivisionError 在除法或求模運算的第二個參數為零時引發
ImportError 導入模塊/對象失敗
IndexError 序列中沒有此索引(index)
TypeError 將內置操作或函數用于類型不正確的對象時引發

?

  • 捕獲異常

在編寫代碼的時候,出現異??梢詫ζ溥M行一定的處理,而在處理之前,我們通常要對其進行捕獲,稱之為 捕獲異常 ??梢允褂胻ry/except語句。(此時還是以ZeroDivisionError為例,演示如何捕獲異常)

            
              
x = float(input("Enter the first number:"))     #用戶輸入的內容為str型,需對其進行強轉,int或者float均可
y = float(input("Enter the second number:"))
print(x/y)
# Traceback (most recent call last):
#     print(x/y)
# ZeroDivisionError: float division by zero
print(x%y)
# Traceback (most recent call last):
#     print(x%y)
# ZeroDivisionError: float modulo
            
          

這個程序運行正常,直到用戶在第二個參數輸入0,對于第二個參數輸入值為0這種異常狀態時,使用try/except進行捕獲異常(這里打印一條對用戶更友好的錯誤消息)。

            
              try:
    x = float(input("Enter the first number:"))
    y = float(input("Enter the second number:"))
    print(x/y)
except:
    print("The sceond number can't be zero!")
    
"""
Enter the first number:1
Enter the second number:0
The sceond number can't be zero!
"""
            
          

或許使用if來判斷y值好像簡單許多,就本例而言,這可能也是更佳的解決方案,因為這個程序執行的除法運算越多,則每條除法運算都需要一條if進行判斷,無疑增加其空間復雜度(O(n)),而使用try/except只需要一個錯誤處理程序。

發生除零行為時,如果啟用了“抑制”功能,將返回None,換言之,如果啟用“抑制”功能,將不應依賴返回值。關閉“抑制”功能時,捕獲異常ZeroDivisionError

            
              class MuffledCalculator:
    muffled = False     # 抑制
    def calc(self,expr):
        try:
            return eval(expr)
        except ZeroDivisionError:
            if self.muffled:
                print('Division by zero is illegal')
            else:
                raise
# eval() 函數用來執行一個字符串表達式,并返回表達式的值。

c = MuffledCalculator()
print(c.calc('10/2'))
# 5.0
print(c.calc('10/0'))   #關閉抑制,報錯
# ZeroDivisionError: division by zero
c.muffled = True
print(c.calc('10/0'))
# Division by zero is illegal
# None
            
          

如果無法處理異常,在except子句中使用不帶參數的raise通常是不錯的選擇,有時你可能想引發別的異常,在這種情況下,導致進入except子句的異常將作為異常上下文儲存起來,并出現在最終的錯誤消息中。

  • 證明except在處理異常優于if

            
              x = float(input("Enter the first number:"))
y = float(input("Enter the second number:"))
print(x/y)

"""
Enter the first number:10
Enter the second number:python
ValueError: could not convert string to float: 'python'
"""
            
          

對于這種情況,用戶在第二個參數輸入的為字符串或者其他類型的數據,此時使用if來判斷還是最優的解嗎?對于任何可能出現的異常進行判斷和捕獲。

            
              try:
    x = float(input("Enter the first number:"))
    y = float(input("Enter the second number:"))
    print(x/y)
except ZeroDivisionError:
    print("The sceond number can't be zero!")
except TypeError:
    print("Please change a data type")
except ValueError:
    print("That wasn't a number,was it?")
            
          

僅當有異常時才會中斷輸入

            
              while True:
    try:
        x = float(input("Enter the first number:"))
        y = float(input("Enter the second number:"))
        print(x / y)
    except:
        print("Invalid input,Please try again")
        break
            
          

僅當沒有引發異常時,才會跳出循環,只要出現錯誤,程序就會要求用戶提供新的輸入

            
              while True:
    try:
        x = float(input("Enter the first number:"))
        y = float(input("Enter the second number:"))
        print(x / y)
    except:
        print("Invalid input,Please try again")
    else:
        break


"""
Enter the first number:a
Invalid input,Please try again
Enter the first number:1
Enter the second number:0
Invalid input,Please try again
Enter the first number:10
Enter the second number:2
5.0
"""
            
          
  • finally的用法

            
              '''
try:
    執行代碼
except:
    如果有異常發生,執行此處的代碼
else:
    如果沒有異常發生,執行此處代碼
finally:                                         
    不管有沒有異常都會執行此處代碼
'''
            
          
  • 自定義異常類

自定義的異常類必須是Exception或者Error的子類?。。?

            
              class My_Exception(Exception):
    '''
    Custom exception types
    '''
    def __init__(self, parameter, para_value):
        my_error = 'The parameter "{0}" is not legal:{1}'.format(parameter, para_value)
        Exception.__init__(self, my_error)
        self.parameter = parameter
        self.para_value = para_value
            
          

對于warnings警告模塊,最后結尾說兩句:

            
              import warnings
warnings.warn("I've got a bad feeling about this.")

# warnings.filters()      用于過濾警告
# warnings.warn             用于發出警告
            
          
  • 小結:

  • 異常對象:異常情況時用異常對象表示的。對于異常情況,有多種處理方式;如果忽略,將導致程序終止。
  • 引發異常:可使用raise語句來引發異常,它將一個異常類或者異常實例作為參數,也可以使用excerpt同時判斷多個異常情況(上面有示例)。如果在except子句中調用raise時沒有提供任何參數,它將重新引發該子句捕獲異常。
  • 自定義的異常類:通過Exception派生出來的自定義異常類
  • 捕獲異常:要捕獲異常,可在try語句中使用except子句,在except子句中,如果沒有指定異常類,將捕獲所有的異常。也可以指定多個異常類,將其放在 元組 中。

  • else子句:除except子句外,還可以使用else子句,在主try塊沒有引發異常時執行。

  • finally子句:確保代碼塊無論怎么樣都可以執行異常,可以用try/finally,將代碼塊放在finally子句中。

  • 警告:警告類似于異常,但是通常只打印一條錯誤消息,可以指定警告類別,因為它們是 Warning 的子類。

按照我的python版本找到了關于warning的文檔。需要請參考!

Warning文檔

?


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品久久久久综合网 | 韩国 欧美 日产 国产精品 | 亚洲第一区视频在线观看 | 狠狠色综合久久婷婷色天使 | 99热久久只有精品6国产32 | 伊人久久网站 | 亚洲国产精品久久久久网站 | 国产在线欧美日韩一区二区 | 久久爱噜噜噜噜久久久网 | 国产欧美日韩精品综合 | 国产成人精品亚洲日本在线 | 国产精品久久久久久久 | 日韩高清一区二区三区不卡 | 日本中文在线播放 | 国产中文字幕视频在线观看 | 四虎四虎1515whh | 夜色成人免费观看 | 成视频年人黄网站免费视频 | 成人午夜网站 | 日韩免费一区二区 | 国产毛茸茸 | 国产精品久久久久久久成人午夜 | 99久久免费国产精品m9 | 精品伊人久久久99热这里只 | 久久无码精品一区二区三区 | 成人免费久久精品国产片久久影院 | 激情五月婷婷红人馆 | 国产伦精品一区二区 | 日本α级毛片视频免费观看 | 中文字幕伦视频 | 日韩短视频 | 午夜a一级毛片一.成 | 精品亚洲一区二区三区在线播放 | 成人 亚洲 | 91精品国产爱久久久久 | 婷婷色六月 | 成人国产在线不卡视频 | 国产欧美高清 | 国产综合91 | 在线不卡视频 | 欧美老司机 |