---
# System prepended metadata

title: 異常處理
tags: [人生苦短，我學Python]

---

# 異常處理
###### tags: `人生苦短，我學Python`

## 異常概述
:::success
在程式運行途中，經常會遇到各式各樣的錯誤，這些錯誤被統稱為異常。這類錯誤大部分都是SyntaxError : invaild syntax(無效的語法)
:::

* 舉例
```shell=
NameError: name 'sss' is not defined
```


## 異常處理語句，使用try...except
:::success
```python=
try:
    block1
except [ExceptionName[as alias]]:
    block2
```
:bulb: block1表示可能出錯的程式碼區塊
:bulb: ExceptionName[as alias]: 可選參數，用於要指定捕獲的異常
:::

* 舉例
```python=
def divsion():
    nums = int(input())
    if nums != 0:
        print("num 不等於 0")

if __name__ == '__main__':
    try:
        divsion()
    except ZeroDivisionError:
        print("不是整數")
    except ValueError as e :
        print("輸入錯誤")
# input x
# output 輸入錯誤"
```
* 如果需要同時處理多個異常......
```python=
# 複製上面的部分
if __name__ == '__main__':
    try:
        divsion()
    except (ValueError, ZeroDivisionError) as e:
        print("Error: ", e)
```
![](https://i.imgur.com/oI5KHPE.png)
* 這樣就能印出是出了甚麼問題

## 異常處理語句，使用try...except...else

* 在上面的程式碼加上
```python=
else:
    print("毫無錯誤")
# number
# num不等於0
# 毫無錯誤
```

## 異常處理語句，使用try...except...finally
* finally加上後，代表不論發生甚麼狀況，都會執行這些程式碼

```python=
finally:
    print("already")
```

## 使用raise語句拋出異常
:::warning
```python=
raise [ExceptionName[(reason)]]
```
:::
* 舉例，可以修改成......
```python=
def divsion():
    nums = int(input())
    if nums >= 0:
        print("num 大於 0")
    if nums == 5:
        raise ValueError("Nope")

# 5
# num 大於 0
# 輸入錯誤 Nope
```



{%hackmd S1DMFioCO %}