詳解python異常處理方法

高洛峰
發布: 2017-03-21 11:57:41
原創
1382 人瀏覽過

異常

異常(Exception)是因為程式的例外、違例、出錯等情況而在正常控制流以外採取的行為,一般分為如下兩個階段:

1.異常發生:一個錯誤發生後被印出來,稱為未處理異常,而預設的處理則是自動輸出一些偵錯訊息並終止程式運行。

2.異常處理:透過程式碼明確地處理異常,則程式不會終止運行,並增強程式的容錯性。

說白了,異常處理的目的就是為了是程式的可執行性更高,能順利的運作下去;同時不讓使用者看到難堪的錯誤訊息,通俗來說就是不讓用戶看見大黃頁。

可以透過python3中的異常類型(Exception)查看異常。

常見的例外:

AttributeError  #试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError  #输入/输出异常;基本上是无法打开文件
ImportError  #无法引入模块或包;基本上是路径问题或名称错误
IndentationError  #语法错误(的子类) ;代码没有正确对齐
IndexError  #下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError  #试图访问字典里不存在的键
KeyboardInterrupt  #Ctrl+C被按下
NameError  #使用一个还未被赋予对象的变量
SyntaxError  #Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError  #传入对象类型与要求的不符合
UnboundLocalError  #试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError #传入一个调用者不期望的值,即使值的类型是正确的
登入後複製

更多的例外:

ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
登入後複製

異常處理

python3中提供try語句處理異常,格式為:

try:
    print('#先运行别指定的代码')
except Exception as e:  #所有的异常都继承至Exception类,可以捕获任意异常
    print(e)  #可以获取异常e
    print('#如果发生了异常,执行异常处理')
else:
    print('#如果主代码块没有异常发生并执行完后,则继续往下执行')
登入後複製

或:

try:
    print('#先运行特定的代码')
except Exception as e:
    print('#捕获对应的异常并处理之')
finally:
    print('#不管异常与否,最终都会执行')
登入後複製
dic = ["English", 'Chinese']
try:
    dic[10]
except IndexError as e:
    print(e)
登入後複製
s1 = 'hello'
try:
    int(s1)
except ValueError as e:
    print(e)
登入後複製

而當遇到非指定異常,則會報錯:

# 未捕获到异常,程序直接报错
 
s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
登入後複製

當要處理多個異常時也可以這樣寫:

except ( AttributeError,NameError ) as e:
    print(e)
    print('#这是捕获多个类型异常的语法')
登入後複製

雖然Exception可以捕獲任意異常,但對於特殊處理或提醒的異常需要先定義,最後定義Exception來確保程式正常運作。所以下面這種寫法也很常用:

s1 = 'hello'
try:
    int(s1)
except KeyError as e:
    print('键错误')
except IndexError as e:
    print('索引错误')
except Exception as e:
    print('错误')
登入後複製

raise語句主動觸發異常,python3中可以利用raise語句拋出一個通用異常類型(Exception),具體如下:

try:
    raise Exception('错误了...') #这是主动引发一个异常
except Exception as e:
    print(e)
登入後複製

python3中也可以透過建立繼承至通用異常類型(Exception)的類,來自訂異常:

#关于raise语句,还有:
class Myerror(Exception):
    def __init__(self,msg):
        self.msg = msg
 
    def __str__(self):  # 以字符串格式输出
        return self.msg
 
 
try:
    raise Myerror('错误')
except Exception as f:
    print(f)
登入後複製

以上是詳解python異常處理方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!