1. 程式人生 > >Python基礎入門(錯誤與異常)

Python基礎入門(錯誤與異常)

#錯誤與異常
​
#錯誤主要是語法上的錯誤
# prinnt("no") #拼寫錯誤 NameError: name 'prinnt' is not defined
print("yes"); # 多加了分號然而並沒有錯
# print("no")#中文輸入法 IndentationError: unexpected indent
​
#異常是指語法正確的情況下,會在執行期間進行報錯
#num = 1/0   這是每一種程式語言講到異常都會使用這個例子   eroDivisionError: division by zero
​
#b = num+1   num變數沒有進行定義   NameError: name 'num' is not defined
​
# '2'+2  TypeError: Can't convert 'int' object to str implicitly
print(int('2')+2)
# 2+'2'   TypeError: unsupported operand type(s) for +: 'int' and 'str'
b = str(2)+'2'
print(b,type(b))
  
yes
4
22 <class 'str'>
In [20]:

"""
首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
如果沒有異常發生,忽略except子句,try子句執行後結束。
如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的型別和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的程式碼。
如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。
一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行
#那麼出現了異常的時候應該怎麼進行處理
​
"""
首先,執行try子句(在關鍵字try和關鍵字except之間的語句)
如果沒有異常發生,忽略except子句,try子句執行後結束。
如果在執行try子句的過程中發生了異常,那麼try子句餘下的部分將被忽略。如果異常的型別和 except 之後的名稱相符,那麼對應的except子句將被執行。最後執行 try 語句之後的程式碼。
如果一個異常沒有與任何的except匹配,那麼這個異常將會傳遞給上層的try中。
一個 try 語句可能包含多個except子句,分別來處理不同的特定的異常。最多隻有一個分支會被執行
"""
​
while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except ValueError:
            print("Oops!  That was no valid number.  Try again   ")
Please enter a number: a
Oops!  That was no valid number.  Try again   
Please enter a number: 'a'
Oops!  That was no valid number.  Try again   
Please enter a number: 2
In [22]:

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 (RuntimeError, TypeError, NameError):
        pass
except:
    print("Unexpected error:", sys.exc_info()[0])
OS error: [Errno 2] No such file or directory: 'myfile.txt'
try except 語句還有一個可選的else子句,如果使用這個子句,那麼必須放在所有的except子句之後。這個子句將在try子句沒有發生任何異常的時候執行。

Python 使用 raise 語句丟擲一個指定的異常。例如:

In [23]:

raise NameError('Koeb')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-23-7fbd1276157a> in <module>()
----> 1 raise NameError('Koeb')

NameError: Koeb

自定義異常

In [25]:

class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
raise MyError("oh shit")
---------------------------------------------------------------------------
MyError                                   Traceback (most recent call last)
<ipython-input-25-05e8a67aef87> in <module>()
      4         def __str__(self):
      5             return repr(self.value)
----> 6 raise MyError("oh shit")

MyError: 'oh shit'