try catch 用法

本文介绍了如何利用TryCatch机制解决浏览器兼容性问题,尤其是在动态生成表格时遇到的不同接口响应速度差异导致的问题,并探讨了TryCatch的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际应用中,碰到了一个问题,就是在动态生成一个表格的时候,从后台接收到的的数据和表头名称是不同的接口,而表格的id是在表头名称这个接口动态生成的,所以就会导致一个问题,在火狐浏览器中,响应请求比较慢
这个时候我们就可以使用 try catch 方法 来 处理浏览器的位置错误

下面是相对简单的例子:

try {
 foo.bar();
} catch (e) {
 if (e instanceof EvalError) {
     alert(e.name + ":" + e.message);
 } 
 else if (e instanceof RangeError) {
     alert(e.name + ": " + e.message);
 } 
 // etc 
}

关于错误 e 的主要属性 :

description: 错误描述 (仅IE可用).
fileName: 出错的文件名 (仅Mozilla可用).
lineNumber: 出错的行数 (仅Mozilla可用).
message: 错误信息 (在IE下同description)
name: 错误类型.
number: 错误代码 (仅IE可用).
stack: 像Java中的Stack Trace一样的错误堆栈信息 (仅Mozilla可用).

关于 try 的一些 应用场景

1、浏览器原罪的场合:也就是兼容性场合,因为浏览器兼容性不是程序员能改正的,所以只能try catch:由于不同浏览器的报错提示是不一样的,根据捕获的浏览器的报错提示判断用户的浏览器,然后做出对应的措施,这时候使用try catch是巧妙的办法,如果用if就比较笨拙,因为if通常只能反馈真或假,不能直接反馈浏览器的报错内容。
2、考虑如下代码。window.a.b是非法的,再跟2对比就没有意义,这样非法的条件,在try catch中仍可以继续运行下去。但在if中window.a.b已经报错,整个页面都会坏掉。如果希望用if写,那么必须先判断window.a是否是合法的,window.a是合法的前提下再判断window.a.b是不是合法的,如果也是合法的,再判断window.a.b是否不等于2,这样是不是很蠢?这时就体现出try catch的妙处了,程序不但知道window.a.b !== 2是假的,而且直接可以知道究竟哪一步就已经是假的。
再想象一下,有一个变量是json.a.b.c,其中的a/b/c都可能是存在的也可能是不存在的,全看具体情况,这时候你简单的写if (json.a.b.c === 2) {…}是不行的,因为json.a.b就可能已经是非法的,所以你如果用if,就要考虑a是不是非法的、a是合法前提下b是不是非法的,b是合法前提下c是不是非法的。但是json.a.b.c === 2在try中就可以直接写,也就是说,我不关心究竟a/b/c谁是非法的,我只关心json.a.b.c到底是不是等于2,不等于2或者任何一步出错,对我来讲没有区别,反正都是不等于2,我不关心哪步出错,而且程序不会坏掉。这是一种比较省心的写法。
另外注意,try catch不能做真假判断,只能做非法判断。也就是说:try {1 === 2},虽然1===2是假,但是是合法的,catch不会捕捉到错误,也不会告诉你1 === 2到底是真是假。所以,写在try里的应该是json.a.b.c而不是json.a.b.c === 2。究竟是不是等于2,是后面的事,是if干的事。简单说,try catch用于捕捉报错,当你不关心哪一步错误,只关心有没有错,就用try catch。

### 正确使用 `try-catch` 结构的方法 `try-catch` 是一种常见的异常处理机制,主要用于捕获并处理程序执行过程中可能出现的错误或异常情况。以下是关于其使用的详细介绍: #### 基本结构 `try-catch` 的基本语法由三个主要部分组成:`try`、`catch` 和可选的 `finally`。 - **`try` 块**:放置可能会引发异常的代码片段。 - **`catch` 块**:定义当特定类型的异常发生时应采取的操作。 - **`finally` 块**(可选):无论是否发生了异常,该块中的代码都会被执行,通常用于清理资源[^2]。 #### 示例代码 下面是一个完整的例子来展示如何正确使用 `try-catch-finally` 结构: ```java public class ExceptionHandlingExample { public static void main(String[] args) { try { int denominator = 0; int result = 10 / denominator; // 将抛出 ArithmeticException } catch (ArithmeticException e) { System.out.println("除零错误已捕捉:" + e.getMessage()); } finally { System.out.println("Finally 块始终会被执行。"); } } } ``` 在这个例子中,尝试了一个可能导致算术异常的操作——整数除以零。如果异常被触发,则进入对应的 `catch` 部分;而不管有没有异常,`finally` 中的内容都将打印出来表示它确实得到了执行。 #### 多重 Catch 块 可以有多个 `catch` 来分别处理不同种类的异常。这允许更精确地针对每种可能发生的错误提供专门的解决方案。 ```java try { String text = null; int length = text.length(); // NullPointerException } catch (NullPointerException npe) { System.out.println("NullPointer 错误:" + npe); } catch (ArithmeticException ae) { System.out.println("Arithmetic 错误:" + ae); } finally { System.out.println("这是 Finally 块."); } ``` 上述代码展示了两个独立的 `catch` 子句,它们各自负责不同的异常类型[^1]。 #### 资源管理与自动关闭特性 自 Java 7 开始引入了所谓的“Try-with-resources”功能,简化了一些常见场景下的资源管理和释放工作流程。只要实现了 AutoCloseable 接口的对象都可以利用此特性,在不需要显式的 close() 方法调用的情况下实现资源的安全回收。 ```java try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { return br.readLine(); } catch (IOException ex) { Logger.getLogger(YourClass.class.getName()).log(Level.SEVERE, null, ex); } ``` 这里通过声明带括号的形式创建了一个 BufferedReader 实例,并将其置于 try 后面的小括号里。这样即使出现 IO 异常或者正常结束读取过程之后,文件流也会得到妥善关闭。 #### 总结 合理运用 `try-catch` 不仅能够增强应用程序健壮性和用户体验,还能有效防止因未预料到的情况而导致整个应用崩溃的风险。务必记住总是考虑加入必要的日志记录以便于后续排查问题所在位置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值