---
# System prepended metadata

title: Python 新手導覽( error 篇 )
tags: [public, Python, mycourse, note]

---

---
title: Python 新手導覽( error 篇 )
tags: Python, note, guiding
---
[TOC]
# 程式出錯怎麼辦
程式出錯有兩種，一種是會導致程式==無法執行==的錯誤；另一種是程式可以正常執行，但執行==結果不如預期==的錯誤。
通常遇到第一種錯誤我們都會很開心，因為它會提示你哪裡出錯了，以及錯誤原因；
第二種錯誤就該頭痛了，因為只能自己想辦法偵錯。
## 導致程式無法執行的錯誤
初學者通常會因為語法的不熟悉，所以花費大量時間在與這種錯誤打交道，熟悉之後處理起來就會快速許多

### 首先最重要的是能看出錯在哪

![](https://i.imgur.com/7w1D5VE.png =150x) ![](https://i.imgur.com/g2kV42B.png =200x)

> module $exec_66 ==line 5== **( 錯在第五行**
> if 10 =+ 3: **( 錯在 if 10 =+ 3: 這句**
> ^ SyntaxError: ==invalid syntax== **( 錯誤類型**

### 1. SyntaxError
> 1. 打錯關鍵字(if/ for/ ...)
> 2. 誤用運算子(+ - * /...)
> 3. 忘了加冒號
> 4. 判別式的 == 少一個等號
> 5. 輸出字串 卻忘了加引號
   `print(hello world)`
   > 他會將 hello world 解讀為兩個變數(因為沒有加引號變成字串)
   > 所以因為在 print() 函式中連續出現兩個變數是不合理的架構 而出錯
> 6. 括弧不成對 print(input()

總之 就是使程式的**架構**出了問題
-> 出現了不認識的運算子 =+
-> 原本應該要有冒號的地方卻沒有冒號 等

### 2. EOFError
> 多打/少打了 input()

snakify 只有給你三個輸入，我寫程式卻要五個輸入 他等半天等不到最後兩個輸入當然會出錯!
==在迴圈中，仔細檢查執行幾次 input() 也是防錯關鍵==

==仔細確認輸入兩個數的方式也是關鍵==
當輸入為 123 456 橫著擺的時候
```python!
a = input() # a 會得到 '123 456'
b = input() # 所以 b 會一直等不到輸入
print(a + b)
```

### 3. IndentationError
> Python 獨有的錯誤: 縮行錯誤

為了保持程式的整齊 python 要求在 if for 等結構後方加上縮排
該縮的地方不縮 不該縮的地方亂縮 就會出錯
   
### 4. TypeError
> 型態錯誤
   
當我做了那個型態所不允許的操作就會出錯
簡單來說像是: `'a'+1` 
字串與數字不能相加 所以就會出錯

### 5. ValueError
> 輸入不符合規則的資料
   
比如 `int('hello')` 這邊我想將字串 `"hello"` 轉為數字顯然是不行的
因為 `int()` 接收的必須是可以轉為數字的資料像是 `"123"`

`int('123 456')` 也沒辦法，`int()` 一次只能處理一個數字

### 6. NameError
> 使用到尚未定義的變數名稱

```python!
print(hello)
hello = 2
```
這邊的 hello 是變數(非字串)
所以他會往**上**找有沒有定義 hello 變數，結果找不到 hello 變數 所以出錯了

### 7. IndexError
> 對列表(List) 使用超出範圍的 索引(index)

```python!
a = []
a = a + a[0]
#       a[0] 應該是多少?
```
```python!
scores = [int(e) for e in input().split()]
print('Last one:', scores[len(scores)])
#                  scores[len(scores)] 超出範圍了，對嗎?
```


### 8. KeyError
> 對字典檔(Dict) 使用未定義的 key

```python!
vote = {}
vote['personA'] = vote['personA'] + price
#                 vote['personA'] + price 應該是多少?
```

### 9. 其他
其他的錯誤也可以試著到網路上查查看解法 直接將錯誤訊息貼過去就行了(當然稍微篩選適合的部分會更好)
畢竟在資訊方面的學習資料 網路資源可以說是課本的幾百幾千倍以上

## 結果不如預期的錯誤
> 這邊就只能靠自己努力了
> 除了仔細閱讀程式中的邏輯錯誤外
> 可以利用一些小技巧幫助自己判斷
> 利用`print('a=', a)` 觀察 `a` 變數當前的數值 以此來發現不合理的地方
> [color=blue]