# Try/Except/finally

## Error

我們來看看以下的範例:

```python
def dividedBy(dividend, divisor):
    return dividend / divisor


a = int(input('被除數是'))
b = int(input('除數是'))
print('結果是' + str(dividedBy(a, b)))
```

如果我們輸入正確的數字，當然會進行正確的除法計算，但是如果我們使用的除數是0，那會發生什麼事呢？

我們會看到：

> Traceback (most recent call last):\
> File "", line 6, in\
> File "", line 2, in dividedBy\
> ZeroDivisionError: division by zero

ZeroDivisionError就是一個python直譯器直接報錯誤(Error)的方式。

## 例外處理

如果我們想要在程式中處理錯誤，那麼我們要使用例外處理。 我們來看看修改後的範例:

```python
def dividedBy(dividend, divisor):
    try:
        return dividend / divisor
    except ZeroDivisionError:
        print('您使用的除數是0喔~')


a = int(input('a='))
b = int(input('b='))
print('a/b結果=' + str(dividedBy(a, b)))
```

然後再試著執行看看。

## finally

我們可能會有機會在不管例外是否有發生，都希望執行某些程式，這時可以使用finally子句， 也就是說，不管程式有無進入except子句，最終都會執行finally子句的程式。

我們來看看修改後的範例:

```python
def dividedBy(dividend, divisor):
    try:
        return dividend / divisor
    except ZeroDivisionError:
        print('您使用的除數是0喔~')
    except:
        print('有錯誤就會執行此區塊')
    finally:
        print('結束try-except-finally')


a = int(input('a='))
b = int(input('b='))
print('a/b結果=' + str(dividedBy(a, b)))
```

我們可以發現，不論你a, b輸入什麼，finally子句都會執行。 另外，except子句可以不接任何的Error在後面，此時代表只要有Error發生，就會執行except子句。

## raise an exception

我們來看看以下的範例:

```python
userInput = 123

if type(userInput) is not str:
  raise Exception("Only string type is allowed")
```

我們可以使用raise敘述句來丟出例外，也就是如果沒有except子句將其接住，則整個程式就會直接結束， 並且以"Only string type is allowed"為說明訊息告知使用者， 這個方式，對於要將程式給予其他的開發者而言，是對其他開發者的一種有利除錯的訊息常規。 以上這個程式，如果執行的話，我們會看到：

> Traceback (most recent call last): File "", line 4, in Exception: Only string type is allowed
