錯誤和異常

錯誤:python


# 錯誤分爲兩種: 1.語法錯誤,沒有按照python語言的規則去寫,致使的錯誤
# 2. 邏輯錯誤
# 語法錯誤1,好比:
print("dlkafkld"                 # 少一個括號
# 語法錯誤2,好比:
a = 1
if a=1                             # 少個:
    print("daff")
# 語法錯誤3,好比:
def a:
    pass
# 邏輯錯誤1
num = int(input(">>>"))
print(num)


# 執行結果:
>>>fadsfa
Traceback (most recent call last):
  File "E:/seafile backup/python3/python3 project/day 29/s1 錯誤和異常.py", line 18, in <module>
    num = int(input(">>>"))
ValueError: invalid literal for int() with base 10: 'fadsfa'



# 邏輯錯誤2
print(aaa)

# 執行結果
Traceback (most recent call last):
  File "E:/seafile backup/python3/python3 project/day 29/s1 錯誤和異常.py", line 33, in <module>
    print(aaa)
NameError: name 'aaa' is not defined


# 邏輯錯誤3
l = ["2","daf"]
print(l[100])

# 執行結果
Traceback (most recent call last):
  File "E:/seafile backup/python3/python3 project/day 29/s1 錯誤和異常.py", line 44, in <module>
    print(l[100])
IndexError: list index out of range

# 邏輯錯誤4
dic = {'name':'alex'}
print(dic["xiao"])

執行結果:
Traceback (most recent call last):
  File "E:/seafile backup/python3/python3 project/day 29/s1 錯誤和異常.py", line 57, in <module>
    print(dic["xiao"])
KeyError: 'xiao'

# 邏輯錯誤5
class Foo:
    pass
print(Foo.name)

執行結果:
Traceback (most recent call last):
  File "E:/seafile backup/python3/python3 project/day 29/s1 錯誤和異常.py", line 66, in <module>
    print(Foo.name)
AttributeError: type object 'Foo' has no attribute 'name'


# 邏輯錯誤6
a = 1/0
print(a)

執行結果:
Traceback (most recent call last):
  File "E:/seafile backup/python3/python3 project/day 29/s1 錯誤和異常.py", line 74, in <module>
    a = 1/0
ZeroDivisionError: division by zero
'''

# 異常:git

異常就是程序運行時發生錯誤的信號(在程序出現錯誤時,則會產生一個異常,若程序沒有處理它,則會拋出該異常,程序的運行也隨之終止)
a = 1/0
print(a)

執行結果:
Traceback (most recent call last):            # Traceback :異常的追蹤信息
  File "E:/seafile backup/python3/python3 project/day 29/s1 錯誤和異常.py", line 74, in <module>
    a = 1/0                                    # 引起異常的錯誤
ZeroDivisionError: division by zero           # ZerDivisionError:異常類     division by zero 異常值


# 異常的種類:
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
異常的處理方式:
# 異常處理1: 用if來處理異常
a = (input(">>>"))
if a.isdigit():
    a = int(a)
else:
    print("%s不是數字"%a)
print(a)

# 處理結果1:
>>>gsf
gsf不是數字
gsf

# 處理結果2:
>>>45
45


# 異常處理2:用try 和 except來處理異常 ====》萬能異常
a = (input(">>>"))
try:
    a = int(a)
except Exception:
    print("輸入的有誤")
print(a)

# 處理結果1:
>>>gadsf
輸入的有誤
gadsf

# 處理結果2:
>>>45
45

# 異常處理3:                          ====》針對某種異常進行處理
try:
    print(a)                             # 出現找不到變量名時會觸發NameError
except NameError:
    print("__NameError__")

# 異常處理4:                          ====》多分支異常
try:
    print(a)
    l = ["a","b"]
    print(l[100])
except NameError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception:
    print("萬能異常")
#  總結try..except
# 1:把錯誤處理和真正的工做分開來
# 2:代碼更易組織,更清晰,複雜的工做任務更容易實現;
# 3:毫無疑問,更安全了,不至於因爲一些小的疏忽而使程序意外崩潰了;

何時用異常處理?安全

首先try...except是你附加給你的程序的一種異常處理的邏輯,與你的主要的工做是沒有關係的,這種東西加的多了,會致使你的代碼可讀性變差

而後異常處理本就不是你2b邏輯的擦屁股紙,只有在錯誤發生的條件沒法預知的狀況下,才應該加上try...except


endspa

相關文章
相關標籤/搜索