JS的报错处理(throw、try、catch)

MDN

throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。

 当日常代码逻辑较复杂时可以使用异常快速定位错误,并进行相应处理。

throw

抛出异常,可以是一段字符串、数字、布尔

function test(i) {
    if(i === 0) {
        throw "i不能等于0"; 
		//throw 777;       
		//throw true;  
    }
    console.log('后续代码!')
}   

test(0);

也可以是一个对象,记录当前报错具体信息,方便快速定位!

 throw { errorCode: -1001, errorMessage: "type不能为0~" } //对象类型
 throw new Error("type不能为0") //使用Error类创建一个报错信息

 

try、catch  

 既然有抛出也要有对应的代码接受,接受后也需要相应的代码处理当前报错。

MDN

try...catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应。

基础语法:

let num = 0
function test(i) {
    if(i === 0) {
        throw "i不能等于0"; 
		//throw 777;       
		//throw true;  
    }
    console.log('后续代码!')
}   
try {
    //监测抛出的报错信息
    test(num)
}catch(e) {
    //e为抛出的报错信息
    console.log(e) 
    //当try接受报错后执行
    num ++;
    test(num)
}

也可以在catch中继续嵌套抛出

let num = 10;
try {
    throw num
} catch(e) {
	if(e > 5) {
        num = 1
    }else {
        throw e
    }
} catch(e) {
    num = 1
}

finally

不管是否抛出错误,都执行

try {
    throw 10
} catch(e) {
	return e
} finally {
	console.log('aaa')
}

 

<think>好的,我现在需要处理用户关于“使用try catch结构”的问题。用户之前询问过如何在Cesium项目中导入GLB模型,现在转向JavaScript的异常处理机制。首先,我要确定用户的使用场景和知识水平。可能用户在使用Cesium的过程中遇到了错误,想了解如何处理异常,或者他们在开发中需要更健壮的代码。 用户的问题比较基础,但作为技术支持,我需要详细解释try...catch的结构和用法,同时给出实际例子。需要确保回答结构清晰,分步骤说明,并覆盖常见的使用场景。 首先,我应该解释try...catch的基本语法,然后说明各个部分的作用:try块包含可能出错的代码,catch处理异常,finally无论是否出错都会执行。接下来,举几个例子,比如处理JSON解析错误、数学运算错误,以及异步操作中的使用。还要提到错误对象的属性,如name和message,以及如何自定义错误类型。 用户可能对异步代码中的异常处理不太清楚,所以需要特别说明在Promise和async/await中的用法。另外,错误传播机制也很重要,比如在嵌套调用中如何处理异常。还要注意最佳实践,比如不要滥用try...catch,区分预期错误和程序错误。 需要检查是否有遗漏的部分,比如finally的用途,或者如何重新抛出错误。同时,要确保示例代码正确,语法符合用户之前的环境(比如ES6+)。最后,提醒用户常见错误和调试技巧,比如利用控制台输出和断点。 可能用户在使用Cesium的API时,某些方法会抛出错误,比如加载模型失败,使用try...catch可以捕获这些错误并进行处理,比如显示用户友好的提示信息。因此,结合之前的项目示例,可以给出一个相关的例子,比如在加载GLB模型时捕获错误。 确保回答符合之前的格式要求,使用中文,结构清晰,代码部分正确使用LaTeX格式,比如行内代码用$...$,独立代码块用$$...$$。同时,避免使用markdown,用自然的分段和编号。 最后,检查是否有技术错误,比如是否正确解释了错误类型,示例代码是否存在语法问题,以及是否覆盖了用户可能关心的各个方面。</think>以下是对JavaScript中`try...catch`结构的详细介绍: 一、基础语法结构 ```javascript try { // 可能产生异常的代码 } catch(error) { // 异常处理 } finally { // 始终执行的代码 } ``` 二、核心功能解析 1. `try`代码块 - 包裹可能抛出异常的代码段 - 至少需要配合一个`catch`或`finally`块 - 示例: ```javascript try { JSON.parse('invalid json'); } catch(e) { console.log('解析失败'); } ``` 2. `catch`代码块 - 接收错误对象参数(约定命名为`error`/`e`) - 错误对象包含两个核心属性: - `error.name`:错误类型(如`SyntaxError`) - `error.message`:错误描述 - 示例: ```javascript try { null.toString(); } catch(e) { console.log(`[${e.name}] ${e.message}`); // 输出:[TypeError] Cannot read properties of null } ``` 3. `finally`代码块 - 无论是否发生异常都会执行 - 常用于资源清理操作 - 示例: ```javascript let fileHandle; try { fileHandle = openFile(); } catch(e) { handleError(); } finally { if(fileHandle) closeFile(fileHandle); } ``` 三、高级应用场景 1. 错误类型判断 ```javascript try { // 业务代码 } catch(e) { if(e instanceof TypeError) { handleTypeError(); } else if(e instanceof RangeError) { handleRangeError(); } } ``` 2. 异步操作处理 ```javascript // 在Promise链中 fetch(url) .then(res => res.json()) .catch(error => console.error('请求失败:', error)); // async/await中 async function loadData() { try { const res = await fetch(url); } catch(e) { handleNetworkError(); } } ``` 3. 自定义错误抛出 ```javascript function validateAge(age) { if(age < 0) { throw new Error('年龄不能为负数'); } } try { validateAge(-5); } catch(e) { console.log(e.message); // 输出:年龄不能为负数 } ``` 四、最佳实践建议 1. 不要滥用try...catch - 只捕获可预期的异常 - 避免包裹整个函数体 2. 保持catch块简洁 - 建议在catch中做两件事: 1. 记录错误日志 2. 返回可处理的错误状态 3. 错误传播控制 ```javascript function processData() { try { parseInput(); } catch(e) { console.log('初步处理失败'); throw e; // 重新抛出给上层 } } ``` 五、调试技巧 1. 在catch块中使用`debugger`语句 2. 结合`console.trace()`查看调用栈 3. 通过`error.stack`获取详细堆栈信息 六、与Cesium结合的示例 ```javascript try { viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(114.385660699, 34.731041583), model: { uri: 'non-existent.glb' } }); } catch(e) { console.error('模型加载失败:', e.message); viewer.entities.add(new Cesium.Entity({ position: Cesium.Cartesian3.fromDegrees(114.385660699, 34.731041583), billboard: { image: 'fallback-icon.png' } })); } ``` 注意事项: - `try...catch`无法捕获异步回调中的异常 - 语法错误(如拼写错误)在解析阶段就会报错,无法被捕获 - 建议使用TypeScript增强类型安全,减少运行时错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值