跳转到内容

编程基础:异常处理

来自维基教科书,开放的书籍,开放的世界

试卷 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 - ⇑ 编程基础 ⇑

← 文件处理 异常处理 调试 →


华夏公益教科书