今天,咱们来聊一个相对轻松的话题。
前段时间,我的一个朋友在面试时被面试官批评了。因为他在准备面试的时候,一直在准备一些比较复杂的系统面试题和原理问题。
结果,面试官突然问了一个简单的问题:
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 循环内外几乎没有差别。
最后,我想说的是,面试准备千万不能忽视基础知识。只有打好坚实的基础,才能轻松应对更复杂、更深入的问题。
以上就是这次分享的全部内容啦!如果这篇文章对你有帮助,请【点赞】并【关注】,谢谢!╰(°▽°)╯
期待与你一同进步。❤️