Logo
Section 1 / 6

错误处理与错误类型

了解错误处理以及不同类型的错误。

导入

错误处理与错误类型

了解错误处理以及不同类型的错误。

错误处理

在任何编程语言中,处理错误或异常情况都是至关重要的。即使是小型脚本和程序,也应理想地具备捕获异常并以预期方式优雅处理的能力。在本章中,我们将深入探讨错误的类型以及如何处理它们。我们将学习如何抛出、捕获和创建自定义错误。

错误类型

通常,错误可分为三类:语法错误、运行时错误和逻辑错误。下面我们逐一分析这些错误。

语法错误

在任何语言中,将词语和短语按规则组合成完整句子的过程称为语法。在计算机科学中,语法指的是语句的结构。从这些定义中可以提炼出两个关键概念:“结构良好”和“结构”。

因此,在任何编程语言中,当解析器检测到一条不正确的语句,或发现程序中缺少括号、方括号等编程结构时,就会出现语法错误。换句话说,语法错误是编程语言对开发者所要求的特定语句结构的违反。如果未遵循这种结构,系统就会抛出错误。以下是一些常见的语法错误示例:

  • 命令、变量或函数名称拼写错误。
  • 缺少分号或缩进不当。
  • 括号 ()、方括号 [] 或花括号 {} 不匹配。

让我们通过一些例子来更好地理解。

PowerShell

1dir() 2write-hst

请在下方终端中逐行输入这些命令,查看错误信息。

Terminal

上述 PowerShell 示例中,第一个命令使用了 dir(即 Get-ChildItem 命令的别名),但其后多出了一个未预期的括号 (),导致语法错误。第二个命令中,Write-Host 命令被拼写为 write-hst,解析器无法识别,从而引发错误。

Python

1dir()) 2prnt('hello')

请在下方终端中逐行输入这些命令,查看错误信息。

1# 在此处输入命令

上述 Python 示例中,第一个命令多了一个多余的右括号 ),导致抛出 'SyntaxError: invalid syntax' 错误。第二个命令中,print() 函数被拼错为 prnt(),解析器无法识别,因此抛出 'NameError: name 'prnt' is not defined' 错误。

运行时错误

如其名称所示,运行时错误只能在程序运行期间发生(前提是不存在语法错误)。这类错误通常出现在程序被要求执行某个它无法可靠处理的操作时。以下是一些常见的运行时错误示例:

  • 文件不存在
  • 除以零

让我们通过具体例子来进一步理解。

PowerShell

1### 尝试将数字除以零 21/0 3 4### 访问一个不存在的文件 5Get-ChildItem /usercode/test.txt

请在下方终端中逐行输入这两条命令,查看错误。

Terminal

Python

1## 尝试将数字除以零 21/0 3 4## 访问一个不存在的文件 5open('/usercode/test.txt')

请在下方输入上述命令,并点击“运行”按钮查看错误。

1# 在此处输入命令

逻辑错误

在编程中,逻辑错误是指程序中的一个缺陷,导致程序行为异常或产生非预期的结果。逻辑错误往往不易立即察觉,因为与语法错误或运行时错误不同,逻辑错误不会导致程序崩溃,且从语言层面看代码是“正确”的。以下是一些常见的逻辑错误示例:

  • 本应进行减法却执行了加法
  • 将赋值操作符 = 错误地用作等于比较(== 或 -eq)
  • 使用了错误的变量名或文件名

让我们通过例子来理解。

1foreach($num in 1..10){ 2 if($num -gt 5){ 3 Write-Host " $num is greater-than 5" 4 } 5 else{ 6 Write-Host " $num is less-than 5" 7 } 8}

上述示例中的逻辑错误在于:当 $num 等于 5 时,else 分支仍会执行。实际上,当数值等于 5 时,$num -gt 5 为假,程序会进入 else 分支并输出 “5 is less-than 5”,但 5 既不大于 5 也不小于 5,因此该输出是错误的。

以下是 Python 中类似的逻辑错误实现。该代码可以正常运行,不会抛出任何错误,但输出结果不符合预期,逻辑上是错误的。

1for num in range(10): 2 if num > 5: 3 print(num,"is greater-than 5") 4 else: 5 print(num,"is less-than 5")

抛出异常或引发错误

有时,开发者需要显式地抛出异常,以便能够被正确处理。否则,编程语言可能不会自动抛出该错误。

PowerShell 提供了 throw 关键字,可用于手动创建异常事件。

语法:

1throw [ExceptionClass] "你的错误信息"

在下面的例子中,我们抛出了一个 FileNotFoundException 异常,当程序中找不到指定文件时触发。

1$path = '\usercod\temp\nosuchfile.txt' 2if(Test-Path $path){ 3 Write-Host "File found: $path" 4}else{ 5 throw [System.IO.FileNotFoundException] "Could not find file: $path" 6}

在 Python 中,要抛出异常需使用 raise 关键字。

语法:

1raise ExceptionClass("你的错误信息")

在下面的 Python 示例中,当数值不满足特定条件时,我们使用 raise 抛出了一个 ValueError。

1num = 0 2if num == 0: 3 raise ValueError("Zero can not be a value") 4else: 5 print('Number:', num)

处理 JSON、XML 和 CSV

使用 try 和 catch 处理异常