跳轉到內容

程式設計基礎:異常處理

來自華夏公益教科書,開放的書籍,開放的世界

試卷 1 - ⇑ 程式設計基礎 ⇑

← 常量 異常處理 內建函式 →


錯誤型別

[編輯 | 編輯原始碼]

當你編寫一個程式時,它往往不會像你預期的那樣工作。它可能無法編譯,也可能在你執行時崩潰,或者可能給你錯誤的結果。這些都是你程式碼中的錯誤,我們可以將它們分為 3 個不同的錯誤類別

  • 編譯錯誤
  • 執行時錯誤
  • 邏輯錯誤

讓我們看看它們分別代表什麼。

編譯(語法)錯誤

[編輯 | 編輯原始碼]

你可能遇到過很多這種錯誤,當你試圖執行你的程式時,它不會編譯,會給你一個錯誤訊息。如果你使用的是類似 Visual Studio 的東西,它甚至會用藍色波浪線來標記有問題的程式碼。你編寫的程式碼的結構或語法存在問題。這可能是一種情況,你忘記新增一個閉括號,或者你拼錯了關鍵字。看看這個例子

For x = 1 two 9
  console.WriteLine(x)
Next

你應該可以看到,在第 1 行,程式設計師拼錯了單詞 to。這段程式碼根本無法工作。

執行時錯誤

[編輯 | 編輯原始碼]

有時你的程式會編譯得很好,但在你實際執行它時會崩潰。例如,這段程式碼

Dim x as integer = 0
Dim total as integer = 0
While x < 5
  total = total + 1
Loop

程式設計師建立了一個無限迴圈,並且 total 的值會趨於無窮大,最終導致程式崩潰。

邏輯(語義)錯誤

[編輯 | 編輯原始碼]

邏輯錯誤是指程式編譯透過,沒有崩潰,但它給出的答案是不正確的。程式碼傳達的邏輯、語義或含義是錯誤的。看看下面的例子

Dim Price as decimal = 45.99
Dim Tax as decimal = 0.20

Console.Writeline("Price {{=}} " & Price)
Console.Writeline("VAT {{=}} " & Price * Tax)
Console.Writeline("Total {{=}} " & Price + Tax)

在上面的例子中,你希望它輸出

   程式碼輸出
價格 = 45.99
增值稅 = 9.198
總計 = 55.188

但由於第 6 行存在邏輯錯誤,它輸出了

   程式碼輸出
價格 = 45.99
增值稅 = 9.198
總計 = 46.19

為了修復它,你必須修復程式碼的邏輯並將第 6 行更改為

Console.Writeline("Total = " & Price + (Price * Tax))
練習:異常處理

命名並給出程式設計程式碼中三種錯誤型別的示例

答案

  • 編譯(語法)
  • 邏輯(語義)
  • 執行時


以下程式碼中存在什麼錯誤,你將如何修復它

dim x as integer
do until x > 5
  x = 1
  x = x + 1
loop

答案

存在一個執行時錯誤。x 永遠不會大於 5,因為第 3 行給 x 賦值為 1,因此,迴圈將始終在 2 處結束,迴圈將永遠不會結束。這可以透過將 x = 1 指令移到迴圈外部,在第 1 行和第 2 行之間來修復。


以下程式碼中存在什麼錯誤,你將如何修復它

dim n as sting
console.writeline("enter your name")
n = console.readline

答案

第一行存在一個編譯(語法)錯誤。dim n as sting 應該改為 dim n as string


以下程式碼中存在什麼錯誤,你將如何修復它

Dim names() As String = {"Harry", "Dave", "Princess", "Nicky"}
'print all the names
For x = 1 to 3
   Console.Writeline("name " & x & " = " & names(x))
Next

答案

第三行存在一個邏輯(語義)錯誤。For x = 1 to 3 應該改為 For x = 0 to 3


以下程式碼中存在什麼錯誤,你將如何修復它

Dim names() As Sting = {"Harry", "Dave", "Princess", "Nicky"}
Dim y As Integer
y = Console.Readline()
'print some of the names
For x = 0 to y
   Console.Writeline("name " & x & " = " & names(x))
Next

答案

第 1 行存在編譯錯誤,Sting 應該改為 String。第 5 行還存在潛在的執行時錯誤,如果使用者輸入的值 y 大於 3,則程式碼將崩潰。這些錯誤可以用多種方法解決,我們現在要研究其中一種方法。


捕獲錯誤

[編輯 | 編輯原始碼]
Dim age as integer
console.writeline("How old are you?")
age = console.readline()
console.writeline("What is your name?")

對於上面的程式碼,如果我們輸入以下內容,可以很容易地使它崩潰

   程式碼輸出

你幾歲了?
捲心菜!

原因,正如你應該已經知道的,變數 age 是一個整數,而你試圖將字串 捲心菜 儲存到一個整數中。這就像試圖將大炮塞進駱駝,它們不相容,VB 肯定會抱怨並破壞你的所有程式碼。我們需要的是一種方法來阻止或捕獲這些錯誤,我們將研究一下 try and catch

Dim age as integer
console.writeline("How old are you?")
Try
  age = console.readline()
Catch ex As Exception
  console.writeline(ex.message)
End Try
console.writeline("What is your name?")

這將處理這個問題

   程式碼輸出

你幾歲了?
蘇格拉底!
從字串 "蘇格拉底!" 轉換為型別 'Integer' 無效。
你叫什麼名字?

讓我們知道你輸入的是一個字串,而它期望的是一個整數。程式沒有崩潰。

練習:異常處理

使用 try and catch 來避免使用者輸入的值 y 會破壞陣列的問題。

Dim names() As String = {"Harry", "Dave", "Princess", "Nicky"}
Dim y As Integer
y = Console.Readline()
'print some of the names
For x = 0 to y
   Console.Writeline("name " & x & " = " & names(x))
Next

答案

Dim names() As String = {"Harry", "Dave", "Princess", "Nicky"}
Dim y As Integer
y = Console.Readline()
'print some of the names
Try
   For x = 0 to y
      Console.Writeline("name " & x & " = " & names(x))
   Next
Catch ex As Exception
   console.writeline("Looks like we're exceeded our array index")
   console.writeline(ex.message)
End Try


單元 1 - ⇑ 程式設計基礎 ⇑

← 檔案處理 異常處理 除錯 →


華夏公益教科書