iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
自我挑戰組

跟著 Go 實戰聖經 一起自學 Go系列 第 29

DAY 29 Go 語言 程式錯誤的類型

  • 分享至 

  • xImage
  •  

昨天終於將函式 (function) 介紹完畢,但當我們在執行函式,尤其讀取檔案、或是打 API 時,總會想知道是否有拿取或是送資料成功,這時便是錯誤處理登場的時機!

程式錯誤的類型

在了解如何處理錯誤之前,應該先了解有哪些錯誤的類型,這樣才可以對症下藥。

語法錯誤 (syntax errors)

語法錯誤是在剛開始學寫程式時最常遇到的錯誤之一,舉些較常遇到的語法錯誤

  1. 括號放錯地方或少了結尾括號
  2. 錯字
  3. 迴圈語法不正確
  4. 將型別不符的引數傳給函式的參數

範例 1:

package main

import "fmt"

func main() {
    name := "奇犽"
    age := 12
    defer myFavorite(name, age)

    name = "西索"
    age = 26
    myFavorite(name, age)
  // 少了結尾的 } 括號

func myFavorite(name string, age int) {
    fmt.Println("我最喜歡的人是:", name, " 他", age, "歲")
}

範例 1(執行結果):

syntax error: unexpected myFavorite, expecting (

不過這種錯誤,當你在寫程式時便可以直接看到語法錯誤的提示,不一定要等到執行時才會知道(如下圖):
語法錯誤

執行期間錯誤 (runtime errors)

執行期間錯誤如其名,便是要等到程式執行才會出現,以下也列幾個常見的錯誤:

  1. 開啟不存在的檔案
  2. 連接不存在的資料庫
  3. 錯誤的數學計算(想將數字除以 0 或 將字串與數字做運算等)
  4. 想用迴圈走訪陣列或切片,但迴圈的索引值大於陣列或切片的索引值
  5. 變數的數字在經過計算之後超過本來的數值範圍,發生越界繞回

範例 2:

package main

import "fmt"

func main() {
    age := 12

    fmt.Fprintln(age/0)
}

範例 2(執行結果):

invalid operation: division by zero

邏輯錯誤 (logic error) 或 語義錯誤 (semantic errors)

邏輯錯誤是三種錯誤類型中最難被察覺的,因為正常是對程式做了錯誤的資料判斷,以下舉幾個常見的錯誤類型:

  1. 錯誤的計算方式
  2. 存取錯誤的資料類型(檔案、變數等)
  3. 變數的邏輯判斷不當

範例 3:
老師說考 60 分以上算是及格,若分數不達 60 的人就要重考,所以我決定寫一個函式來做判斷:

package main

import "fmt"

func main() {
    fraction := 60

    if fraction > 60 {
        fmt.Println("分數及格")
    } else {
        fmt.Println("不及格重考!")
    }
    
}

範例 3(執行結果):

不及格重考!

正常來說分數 60 算是及格,但為何我跑出來的結果卻是不及格?其實是因為我 if 判定,少判定到 >= 60 。
雖說執行的結果不如我的預期,但這種時候並不會報錯,所以說只能從程式的邏輯開始尋找,這就是最難找的錯誤了!

那今天就簡單介紹程式錯誤的類型,明天再繼續詳細介紹錯誤處理,明天見~~


上一篇
DAY 28 Go 語言 函式 (function) 用 defer 延後執行函式
下一篇
# DAY 30 Go 語言 錯誤處理 error 值
系列文
跟著 Go 實戰聖經 一起自學 Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言