面试:一个关于try-catch的问题,我面试失败了……

今天,咱们来聊一个相对轻松的话题。

前段时间,我的一个朋友在面试时被面试官批评了。因为他在准备面试的时候,一直在准备一些比较复杂的系统面试题和原理问题。

结果,面试官突然问了一个简单的问题:

try - catch 应该写在 for 循环里面还是外面?并说明理由。

一时间,我朋友都没搞清楚这个问题在问什么,就随口回答说他习惯把它放在 for 循环外面,因为这样看起来更美观。

但这给面试官留下了不好的印象,也为他后续面试失败埋下了伏笔……😔

实际上,这个问题的答案并不是说放在里面或者外面就一定更好或者更差。这需要结合具体的使用场景来回答。

使用场景

因为当异常发生时,try - catch 放在 for 循环内外会有不同的效果。

所以需要结合具体的业务场景来考虑。

① try - catch 放在 for 循环外面

代码示例:

# Python示例
def outside():
    try:
        for count in range(1, 5):
            if count == 3:
                # 这里会引发异常,Python中除以0会报错
                num = count / 0  
            else:
                print("success, count:", count)
    except Exception as e:
        print("An exception occurs.")

# Java示例
public static void outside() {
    try {
        for (int count = 1; count <= 4; count++) {
            if (count == 3) {
                // 故意制造一个异常
                int num = count / 0;
            } else {
                System.out.println("success, count:" + count);
            }
        }
    } catch (Exception e) {
        System.out.println("An exception occurs.");
    }  
}

输出:

success, count:1
success, count:2
An exception occurs.

很明显,当 try - catch 放在 for 环外时,如果在 for 循环过程中发生异常,那么 for 循环将会终止。

② try - catch 放在 for 循环里面

代码示例:

# Pyton示例
def try_inside():
    for count in range(1, 5):
        try:
            if count == 3:
                num = count / 0  
            else:
                print("success, count:", count)
        except Exception as e:
            print("An exception occurs.")

# Java示例
public static void tryInside() {  
  
    for (int count = 1; count <= 4; count++) {  
        try {  
            if (count == 3) {  
                // 故意制造一个异常
                int num = count / 0;  
            } else {  
                System.out.println("success, count:" + count);  
            }  
        } catch (Exception e) {  
            System.out.println("An exception occurs.");  
        }  
    }  
}

输出:

success, count:1
success, count:2
An exception occurs.
success, count:4

当 try - catch 在 for 循环内部时,如果在 for 循环过程中发生异常,该异常会被 catch 捕获,不会影响 for 循环的继续执行。

如果……在面试中,你连上述这种放在内外的使用效果都没搞对,那真的就只能等通知了。

接下来,咱们来讨论一下性能方面的差异。

性能

在时间方面,实际上没有差别。

在内存使用方面,如果没有异常,也没有差别。

但如果发生异常,那就得注意了。

需要注意什么呢?看下面的代码:

# Python示例
import sys
def main():
    start_memory = sys.getsizeof(sys.getrecursionlimit())
    for i in range(100000):
        try:
            if i > 2:
                num = i / 0  
            else:
                print("success, i:", i)
        except Exception as e:
            print("An exception occurs.")
    end_memory = sys.getsizeof(sys.getrecursionlimit())
    memory_used = end_memory - start_memory
    print("memoryUsed:", memory_used, "byte")

# Java示例
public class TryCatchDemo {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        long startMemory = runtime.totalMemory() - runtime.freeMemory();
        for (int i = 0; i < 100000; i++) {
            try {
                if (i > 2) {
                    // 如果这批数据有问题,全是异常情况,
                    // 这意味着将近 10 万个异常将会被抛出。
                    int num = i / 0;
                } else {
                    System.out.println("success, i:" + i);
                }
            } catch (Exception e) {
                System.out.println("An exception occurs.");
            }
        }
        long endMemory = runtime.totalMemory() - runtime.freeMemory();
        long memoryUsed = endMemory - startMemory;
        System.out.println("memoryUsed: " + memoryUsed + " byte");
    }
}

输出:

可以看出,当 try - catch 放在 for 循环内部时,由于异常不会终止 for 循环。所以如果真的存在大量业务流程都会出现异常的情况,那么在短时间内会消耗大量内存。

如果代码错误不多,try - catch 放在 for 循环内外几乎没有差别。

最后,我想说的是,面试准备千万不能忽视基础知识。只有打好坚实的基础,才能轻松应对更复杂、更深入的问题。

以上就是这次分享的全部内容啦!如果这篇文章对你有帮助,请【点赞】并【关注】,谢谢!╰(°▽°)╯

期待与你一同进步。❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qingmu2024

您的鼓励是我最大的创作动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值