ZetCode

JavaScript try/catch/finally 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 JavaScript 中的 try/catch/finally 关键字处理错误。

try/catch/finally 关键字

try/catch/finally 语句标记一个要尝试执行的代码块,并指定在抛出异常时采取的响应。它允许优雅的错误处理,而不是突然的程序终止。

try 块包含可能抛出异常的代码。catch 块包含处理异常的代码。无论结果如何,finally 块都会在 try/catch 之后执行。

JavaScript 错误可以由运行时抛出,或使用 throw 语句显式抛出。try/catch/finally 结构提供了结构化的异常处理,类似于其他编程语言。

基本 try/catch 示例

以下示例演示了 try/catch 的基本用法。

main.js
try {
    let result = riskyOperation();
    console.log(result);
} catch (error) {
    console.log('An error occurred:', error.message);
}

此代码尝试执行 riskyOperation(),它可能会抛出错误。如果发生错误,执行将跳转到 catch 块。错误对象包含有关出错的详细信息。

$ node main.js
An error occurred: riskyOperation is not defined

捕获特定错误类型

JavaScript 允许捕获特定错误类型以进行更精确的处理。

main.js
try {
    JSON.parse('invalid json');
} catch (error) {
    if (error instanceof SyntaxError) {
        console.log('Syntax error:', error.message);
    } else {
        console.log('Unexpected error:', error);
    }
}

此示例专门检查解析 JSON 时的 SyntaxError。可以以不同的方式处理不同的错误类型。 instanceof 运算符检查错误类型。

$ node main.js
Syntax error: Unexpected token i in JSON at position 0

finally 块

无论是否发生错误,finally 块都会执行。

main.js
let connection = { open: true };

try {
    console.log('Using connection');
    throw new Error('Network failure');
} catch (error) {
    console.log('Error:', error.message);
} finally {
    connection.open = false;
    console.log('Connection closed');
}

在这里,finally 确保即使发生错误,连接也能正确关闭。这对于清理操作(例如关闭文件或数据库连接)很有用。

$ node main.js
Using connection
Error: Network failure
Connection closed

嵌套 try/catch 块

try/catch 块可以嵌套以处理不同级别的错误。

main.js
try {
    try {
        nonExistentFunction();
    } catch (innerError) {
        console.log('Inner catch:', innerError.message);
        throw new Error('Wrapped error');
    }
} catch (outerError) {
    console.log('Outer catch:', outerError.message);
}

此示例显示了嵌套错误处理。内部 catch 处理初始错误,然后抛出一个由外部 catch 捕获的新错误。这允许错误包装和重新抛出。

$ node main.js
Inner catch: nonExistentFunction is not defined
Outer catch: Wrapped error

自定义错误抛出

您可以使用 throw 语句抛出自定义错误。

main.js
function validateAge(age) {
    if (age < 0) {
        throw new Error('Age cannot be negative');
    }
    if (age > 120) {
        throw new RangeError('Age seems invalid');
    }
    return age;
}

try {
    validateAge(150);
} catch (error) {
    console.log(error.name + ':', error.message);
}

此函数根据验证失败抛出不同的错误类型。自定义错误提供了关于发生错误的有意义的反馈。错误类型有助于对不同的失败情况进行分类。

$ node main.js
RangeError: Age seems invalid

带有 try/catch 的 Async/await

try/catch 与 async 函数一起使用以处理 promise 拒绝。

main.js
async function fetchData() {
    try {
        let response = await fetch('https://invalid.url');
        let data = await response.json();
        console.log(data);
    } catch (error) {
        console.log('Fetch failed:', error.message);
    }
}

fetchData();

此示例显示了 async 代码中的错误处理。try/catch 块捕获网络错误和 JSON 解析错误。Async/await 使基于 promise 的错误处理更直观。

$ node main.js
Fetch failed: fetch failed

错误对象属性

错误对象包含用于调试的有用属性。

main.js
try {
    null.someProperty;
} catch (error) {
    console.log('Name:', error.name);
    console.log('Message:', error.message);
    console.log('Stack:', error.stack.split('\n')[0]);
}

此代码演示了常见的错误属性。 name 标识错误类型。 message 提供人类可读的描述。 stack 包含用于调试的调用堆栈跟踪。

$ node main.js
Name: TypeError
Message: Cannot read properties of null (reading 'someProperty')
Stack: TypeError: Cannot read properties of null (reading 'someProperty')

来源

try/catch - 语言参考

在本文中,我们已经演示了如何使用 try/catch/finally 在 JavaScript 中进行错误处理。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。