> For the complete documentation index, see [llms.txt](https://nkust.gitbook.io/python/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nkust.gitbook.io/python/li-wai-li.md).

# 例外處理

在程式執行的過程中經常會出現意想不到的情形，預設的情況下，Python在翻譯及執行的過程中只要出現錯誤就會立即顯示錯誤訊息並馬上停止程式的執行，此程情況經常會讓使用者非常地因擾，因為有時候是可以避免此種情形的發生，給予使用者適當的提示，待使用者修正情況之後再繼續執行。這就是例外處理的基本原則。

許多先進的程式語言都會有例外處理的機制，以避免因為使用者輸入的問題或設定的問題造成程式被迫中斷，或產生不可預期的狀況。最常見的情形是使用者輸入的地方，請檢視以下的程式例：

```python
x = int(input("x=?"))
print("{}的平方是：{}".format(x, x**2))
```

在這個程式中我們讓使用者輸入一個數值放在x，然後印出這個數的平方值。如我們之前所說，input這個函數會預設把輸入的內容當做是字串處理，因此需要在input函數的外圍再加上一個int函數，把字串轉換成數值。儘管我們預期使用者會輸入數字，但是在這個例子中，如果使用者直接按下Enter，或是輸入一個非數字的資料，直譯器就會出現如下所示的錯誤訊息，然後程式就被中斷了：

```
x=? kk
Traceback (most recent call last):
  File "python", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'kk'
```

相信大部份的使用者都會看不懂這個的訊息是什麼，因為它主要是要呈現給程式設計人員看的，目的是為了要協助程式設計人員進行偵錯之用。

為了避免此種情形發生，我們需要使用例外處理，也就是在預期可能會發生錯誤的地方，由程式設計人員事先想好應對的措施，至少也要給個使用者可以理解的訊息。仔細檢查錯誤的地方是在第1行，當使用者輸入的資料如果不是可以轉換成數值的資料（例如是空字串或是英文字），則試圖使用int()函數去轉換它就會發生錯誤。

我們使用例外處理，然後把程式碼修改如下：

```python
x = input("x=?")
try:
    n = int(x)
    print("{}的平方是：{}".format(n, n**2))    
except:
    print("你輸入的資料是不正確的喔，請檢查輸入的是否為數字。")
```

首先在第一行的地方，我們先不做數值轉換的，而是把它放到try這個例外處理指令之後，也就是在第3行的地方。在第3行的地方進行數值的轉換，然後把轉換的結果放在變數n，再計算n的值即可。

如果在try底下的程式區塊有任何一個地方發生任何錯誤的話，在發生錯誤的當下，程式的執行流程就會立即被轉移到except的區塊下，在這個例子中，我們直接假設是發生了數值轉換的錯誤，直接印出說明給使用者瞭解。

當然，發生的錯誤種類有非常多種可能性，在except之後是可以加上參數來瞭解到更多錯誤訊息的，不過這些部份就請各位同學們自行去參閱相關的教學文件了。
