跳到主要内容

TypeScript 异常处理

在编写程序时,错误和异常是不可避免的。无论是用户输入错误、网络请求失败,还是代码逻辑问题,都可能导致程序崩溃。为了确保程序的健壮性,我们需要学会如何处理这些异常。TypeScript 提供了强大的异常处理机制,帮助我们捕获和处理错误。

什么是异常处理?

异常处理是一种编程技术,用于捕获和处理程序运行时可能发生的错误。通过异常处理,我们可以防止程序因未处理的错误而崩溃,并能够优雅地处理这些错误,提供更好的用户体验。

在 TypeScript 中,异常处理主要通过 try...catch...finally 语句来实现。

try...catch...finally 语句

try...catch...finally 是 TypeScript 中处理异常的核心语法。它的基本结构如下:

typescript
try {
// 可能会抛出异常的代码
} catch (error) {
// 捕获并处理异常
} finally {
// 无论是否发生异常,都会执行的代码
}

try

try 块包含可能会抛出异常的代码。如果在 try 块中的代码抛出了异常,程序会立即跳转到 catch 块。

catch

catch 块用于捕获并处理 try 块中抛出的异常。catch 块中的 error 参数是一个包含错误信息的对象,通常是 Error 类型的实例。

finally

finally 块中的代码无论是否发生异常都会执行。通常用于释放资源或执行清理操作。

示例

typescript
function divide(a: number, b: number): number {
if (b === 0) {
throw new Error("除数不能为零");
}
return a / b;
}

try {
const result = divide(10, 0);
console.log(`结果: ${result}`);
} catch (error) {
console.error(`捕获到错误: ${error.message}`);
} finally {
console.log("计算完成");
}

输出:

捕获到错误: 除数不能为零
计算完成

在这个示例中,divide 函数在除数为零时会抛出一个错误。try 块中的代码捕获了这个错误,并在 catch 块中处理了它。无论是否发生错误,finally 块中的代码都会执行。

自定义异常

除了使用内置的 Error 类型,我们还可以创建自定义的异常类。自定义异常类可以包含更多的信息,帮助我们更好地处理错误。

typescript
class CustomError extends Error {
constructor(message: string, public code: number) {
super(message);
this.name = "CustomError";
}
}

try {
throw new CustomError("这是一个自定义错误", 500);
} catch (error) {
if (error instanceof CustomError) {
console.error(`捕获到自定义错误: ${error.message}, 错误代码: ${error.code}`);
} else {
console.error(`捕获到未知错误: ${error.message}`);
}
}

输出:

捕获到自定义错误: 这是一个自定义错误, 错误代码: 500

在这个示例中,我们定义了一个 CustomError 类,它继承自 Error 类,并添加了一个 code 属性。在 catch 块中,我们检查捕获的错误是否是 CustomError 的实例,并根据错误类型进行不同的处理。

实际应用场景

1. 网络请求

在进行网络请求时,可能会遇到各种错误,如网络连接失败、服务器返回错误等。使用异常处理可以优雅地处理这些错误。

typescript
async function fetchData(url: string) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP 错误! 状态码: ${response.status}`);
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error(`请求失败: ${error.message}`);
}
}

fetchData("https://api.example.com/data");

2. 文件操作

在读取或写入文件时,可能会遇到文件不存在、权限不足等问题。使用异常处理可以确保程序在遇到这些问题时不会崩溃。

typescript
import * as fs from "fs";

function readFile(path: string) {
try {
const content = fs.readFileSync(path, "utf-8");
console.log(content);
} catch (error) {
console.error(`读取文件失败: ${error.message}`);
}
}

readFile("nonexistent.txt");

总结

异常处理是编写健壮程序的关键技术之一。通过使用 try...catch...finally 语句,我们可以捕获和处理程序运行时可能发生的错误,确保程序在遇到异常时不会崩溃。此外,自定义异常类可以帮助我们更好地组织和处理错误信息。

在实际开发中,异常处理广泛应用于网络请求、文件操作、用户输入验证等场景。掌握异常处理技术,可以显著提高代码的健壮性和可维护性。

附加资源与练习

  • 练习 1: 编写一个函数,接受两个数字作为参数,并返回它们的商。如果除数为零,抛出异常并捕获处理。
  • 练习 2: 创建一个自定义异常类 ValidationError,用于处理表单验证错误。在表单验证失败时抛出该异常,并捕获处理。
提示

在编写代码时,尽量考虑所有可能的异常情况,并使用异常处理来确保程序的健壮性。