如何使用 `try...catch` 块处理错误?
主题
JavaScript
TL;DR
要使用 try...catch 块处理错误,您需要将可能抛出错误的代码包装在 try 块中。如果发生错误,控制权将转移到 catch 块,您可以在其中处理错误。或者,您可以使用 finally 块来执行代码,无论是否发生错误。
try {// Code that may throw an error} catch (error) {// Handle the error} finally {// Code that will run regardless of an error}
如何使用 try...catch 块处理错误?
基本结构
try...catch 语句由 try 块、catch 块和可选的 finally 块组成。
try {// Code that may throw an error} catch (error) {// Handle the error} finally {// Code that will run regardless of an error}
示例
以下是使用 try...catch 处理错误的示例:
function riskyOperation() {const invalidJsonString = '{"name": "John}'; // Try changing this to a valid JSON stringreturn JSON.parse(invalidJsonString);}try {let result = riskyOperation();console.log(result);} catch (error) {console.error('An error occurred:', error.message);} finally {console.log('This will run regardless of an error');}
解释
try块:包含可能抛出错误的代码。如果发生错误,控制权将转移到catch块。catch块:包含处理错误的代码。error对象包含有关错误的信息。finally块:包含无论是否发生错误都将运行的代码。这对于清理任务很有用。
嵌套 try...catch 块
您可以嵌套 try...catch 块来处理不同级别的错误:
function anotherRiskyOperation() {const person = undefined;console.log(person.name);}try {try {anotherRiskyOperation();} catch (innerError) {// Error (if any) for anotherRiskyOperation caught hereconsole.error('Inner error:', innerError.message);}} catch (outerError) {// Inner error does not reach hereconsole.error('Outer error:', outerError.message);}
重新抛出错误
如果希望由外部 try...catch 块处理错误,您可以从 catch 块重新抛出错误:
function yetAnotherRiskyOperation() {const numerator = 10;const denominator = 0;if (denominator === 0) {throw new Error('Cannot divide by zero');}return numerator / denominator;}try {try {const result = yetAnotherRiskyOperation();console.log('Divisinon result:', result);} catch (innerError) {console.error('Inner error:', innerError.message);throw innerError; // Re-throw the error}} catch (outerError) {console.error('Outer error:', outerError.message);}
使用 finally 进行清理
finally 块对于清理任务很有用,例如关闭文件或释放资源:
// openFile() 和 closeFile() 是自定义实现try {let file = openFile('example.txt');// 对文件执行操作} catch (error) {console.error('发生错误:', error.message);} finally {closeFile(file); // 确保文件已关闭}