錯誤和異常及簡單的異常處理

錯誤和異常

錯誤

  • 語法錯誤(invalid syntax)
  • 邏輯錯誤(logic error)
  • 執行期間錯誤(runtime error)
while True
    print(1)
out:
while True
         ^
SyntaxError: invalid syntax

python的語法分析器完成,檢測到錯誤所在文件和行號,以向上箭頭標記錯誤位置。最後顯示錯誤類型。當程序檢測到一個錯誤,解釋器就無法繼續執行,拋出異常,終止程序。

異常

  • 系統根據不同的錯誤,拋出不同的異常。
>>> 1/0
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    1/0
ZeroDivisionError: division by zero`
  • 常見的異常
異常 描述
NameError 嘗試訪問一個沒有申明的變量
ZeroDivisionError 除數爲 0
SyntaxErro 語法錯誤
IndexError 索引超出序列範圍
KeyError 請求一個不存在的字典關鍵字
FileNotFoundError 文件未發現錯誤(比如你要讀的文件不存在)
AttributeError 嘗試訪問未知的對象屬性
ModuleNotFoundError 模塊未發現
IndentationError 縮進

異常處理

  • 程序一旦發生錯誤,程序就無法繼續運行,爲了讓程序健壯,可做相關異常處理

  • try …except…

    try:	
    try_statements嘗試執行語句
    except  [exceptionType [as identifier]]:
    except_statements
    [else:
    else_statements]
    [finally:
    finally_statements]    
    • try子句

      • try … except 必須放在可能發生異常的程序段周圍,而try_statements則是可能發生異常的程序段。
    • except子句 做不同的處理,可以使用多個except子句,其中,exceptionType是欲捕捉的異常類型,省略不寫,表示爲預設類型:BaseException,所有異常都繼承自該類別。

      • [as identifier]可以將捕捉到的異常指向一個變量,然後,通過該變量獲得異常相關的信息。

      • 不帶任何異常類型使用except,將捕獲所有發生的異常。不推薦這麼使用,因爲我們不能通過該程序識別出具體的異常信息。

    • else子句

      • 當try_statements沒有異常發生時,會跳過except子句,執行else_statements。

      • 該子句爲可選語句,可以指定或者省略。

    • finally子句

      • 當要離開try … except 時(無論異常是否發生),就會執行finally_statements,可以使清除錯誤或者收尾的語句。可給可忽略。
try:
    a=eval(input('請輸入被除數:'))
    b=eval(input('請輸入除數:'))
    c=a/b
except  ZeroDivisionError as e:
    print(e.args)
except NameError:
    print('請注意變量是否賦值')
except TypeError as e :
    print(e.args)
else:
    print('a/b=',a/b)
finally:
    print('再見')
結果    
請輸入被除數:1
請輸入除數:0
('division by zero',)
再見
---------------------------------------
請輸入被除數:1
請輸入除數:b  ####並不將b作字符串,而是將其當作變量名
請注意變量是否賦值
再見
---------------------------------------
請輸入被除數:2,   ####默認返回元組
請輸入除數:7
("unsupported operand type(s) for /: 'tuple' and 'int'",)
再見
try:
    a=eval(input('請輸入被除數:'))
    b=eval(input('請輸入除數:'))
    c=a/b
except  (ZeroDivisionError,NameError,TypeError )as e:
    print(e.args)
else:
    print('a/b=',a/b)
finally:
    print('再見')
 結果   
請輸入被除數:+    ###爲預設的錯誤類型
再見
Traceback (most recent call last):
  File "C:/Users/12273/Desktop/python/text.py", line 2, in <module>
    a=eval(input('請輸入被除數:'))
  File "<string>", line 1
    +
    ^
SyntaxError: unexpected EOF while parsing
--------------------------------------------------
請輸入被除數:0
請輸入除數:0
('division by zero',)
再見

注:上述程序發生預設以外的錯誤,依然會報錯,可以在except(exceptionType)之後,再跟一個except:()捕捉其他未知異常,當之前預設異常出發後,該語句不會執行,當發生未預設的異常後,纔會執行該語句.

觸發異常(raise)

除了系統拋出的異常,我們可以用raise語句自己去觸發異常。

格式:

raise [Exception[,args [,traceback]]]
Exception:異常類型
args:我們自己提供的異常參數
traceback:可選,如果存在,跟蹤異常對象
try:
    raise NameError('Sorry,Error occurs!!!!')
except NameError:
    print('it\'s over')
raise NameError('Sorry,Error occurs!!!!')
結果
it's over
Traceback (most recent call last):
  File "C:/Users/12273/Desktop/python/text.py", line 6, in <module>
    raise NameError('Sorry,Error occurs!!!!')
NameError: Sorry,Error occurs!!!!

斷言(assert)

assert 	condition
邏輯上相當於
if not condition:
	raise 	AssertionError()
爲斷言添加一個異常參數
assert  expression[,args]
assert 1==2
    assert 1==2
AssertionError

li=[1,2]
assert len(li)>=3,'元素個數小於5'
assert len(li)>=3,'元素個數小於5'
AssertionError: 元素個數小於5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章