首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么finally块在调用除块之外的sys.exit(0)后执行?

在Python中,finally块是一个异常处理结构,它的目的是在tryexcept块中的代码执行完毕后,无论是否发生异常,都会执行finally块中的代码。这种结构可以用于清理资源、关闭文件、释放内存等操作。

sys.exit(0)被调用时,程序会立即退出,不再执行后续的代码。但是,如果在tryexcept块中调用了sys.exit(0),程序会在finally块中的代码执行完毕后退出。这是因为finally块中的代码是在tryexcept块之后执行的,无论是否发生异常。

这种设计是为了确保finally块中的代码始终会被执行,即使在tryexcept块中调用了sys.exit(0)。如果finally块中的代码没有被执行,可能会导致资源泄漏或其他问题。

如果您希望在调用sys.exit(0)后不执行finally块中的代码,可以使用其他方法来实现,例如使用os._exit(0)raise SystemExit(0)。这些方法会立即退出程序,不会执行finally块中的代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

第六章:异常

因此为了保证程序在出现异常不被中断,至少main方法不要再使用throws进行声明了。 发生异常发生异常位置上,往下代码是不会执行,除非进行了异常捕捉。 4.3....6. finally语句 finally语句代码是一定会执行。...finally语句不能单独使用,至少需要配合try语句一起使用: try...finally try...catch...finally 通常在finally语句中完成资源释放 资源释放工作比较重要...为了保证资源关闭,也就是说:不管程序是否出现异常,关闭资源代码一定要保证执行。 因此finally语句中通常进行资源释放。 final、finally、finalize分别是什么?...final是一个关键字,修饰类无法继承,修饰方法无法覆盖,修饰变量不能修改。 finally是一个关键字,和try一起使用,finally语句代码一定会执行

8610
  • 《流畅Python》第十五章学习笔记

    for 仅当for循环运行完毕(没有被break语句终止)才运行else while 仅当while循环因条件为假值而退出(没有被break语句终止)才运行else try 仅当try中没有异常抛出时才运行...else with with不仅能管理资源,还能用于去掉常规设置和清理代码,或者另一个过程前后只想操作。...with语句目的是简化try/finally模式 这种模式用于保证一段代码运行完毕执行某项操作,即使那段代码由于异常、return或sys.exit()调试而中止,也会执行指定操作 with语句开始时候会在上下文管理对象上调用...__enter__方法 with语句结束时候户在上下文管理对象上调用exit方法 exit三个参数 def __exit__(self, exc_type, exc_value, traceback...print("退出") if __name__ == '__main__': with A(): print('test') assert 0

    28910

    Java基础系列6:深入理解Java异常体系

    catch对应异常类型和一个代码,用于处理try发生对应类型异常。【异常处理程序】 finally – 用于清理资源,finally语句总是会被执行。...如果运行该程序时输入第二个参数是0,将发生0异常,Java运行时将调用ArithmeticException对应catch处理该异常。...catch处理异常遵循着:先小大,即先子类后父类。正如在前面程序所看到,程序总是把对应Exception类catch放在最后,这是为什么呢?...假设程序try里进行资源回收,根据图10.1所示异常捕获流程—一如果try某条语句引起了异常,该语句其他语句通常不会获得执行机会,这将导致位于该语句之后资源回收语句得不到执行。...不管try代码是否出现异常,也不管哪一个catch执行,甚至try或catch执行了return语句,finally总会被执行

    57930

    Java异常详解及如何处理

    执行流跳转到最近匹配异常处理catch代码执行,异常被处理完执行流会接着“处理了这个异常catch代码”后面接着执行。...2、同一try…catch…finally中 ,如果try中抛出异常,且有匹配catch,则先执行catch,再执行finally。...如果没有catch匹配,则先执行finally,然后去外面的调用者中寻找合适catch。...3、同一try…catch…finally中 ,try发生异常,且匹配catch中处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally,然后去外围调用者中寻找合适catch...也就是说:try…catch…finallyreturn 只要能执行,就都执行了,他们共同向同一个内存地址(假设地址是0x80)写入返回值,执行将覆盖先执行数据,而真正被调用者取返回值就是最后一次写入

    1.3K50

    Java中异常和处理详解

    执行流跳转到最近匹配异常处理catch代码执行,异常被处理完执行流会接着“处理了这个异常catch代码”后面接着执行。...2、同一try...catch...finally中 ,如果try中抛出异常,且有匹配catch,则先执行catch,再执行finally。...如果没有catch匹配,则先执行finally,然后去外面的调用者中寻找合适catch。...3、同一try...catch...finally中 ,try发生异常,且匹配catch中处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally,然后去外围调用者中寻找合适...也就是说:try...catch...finallyreturn 只要能执行,就都执行了,他们共同向同一个内存地址(假设地址是0x80)写入返回值,执行将覆盖先执行数据,而真正被调用者取返回值就是最后一次写入

    56721

    干货 | Java 中不得不知异常和处理详解

    执行流跳转到最近匹配异常处理catch代码执行,异常被处理完执行流会接着“处理了这个异常catch代码”后面接着执行。...2、同一try…catch…finally中 ,如果try中抛出异常,且有匹配catch,则先执行catch,再执行finally。...如果没有catch匹配,则先执行finally,然后去外面的调用者中寻找合适catch。...3、同一try…catch…finally中 ,try发生异常,且匹配catch中处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally,然后去外围调用者中寻找合适catch...也就是说:try…catch…finallyreturn 只要能执行,就都执行了,他们共同向同一个内存地址(假设地址是0×80)写入返回值,执行将覆盖先执行数据,而真正被调用者取返回值就是最后一次写入

    1K71

    【转】java中异常与try catch finally详解

    执行流跳转到最近匹配异常处理catch代码执行,异常被处理完执行流会接着“处理了这个异常catch代码”后面接着执行。...2、同一try...catch...finally中 ,如果try中抛出异常,且有匹配catch,则先执行catch,再执行finally。...如果没有catch匹配,则先执行finally,然后去外面的调用者中寻找合适catch。...3、同一try...catch...finally中 ,try发生异常,且匹配catch中处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally,然后去外围调用者中寻找合适...也就是说:try...catch...finallyreturn 只要能执行,就都执行了,他们共同向同一个内存地址(假设地址是0x80)写入返回值,执行将覆盖先执行数据,而真正被调用者取返回值就是最后一次写入

    85230

    JavaSE(十一)之异常处理详解

    只有finally执行完成之后,         才会回来执行try或者catchreturn或者throw语句,如果finally中使用了return或者throw等终止方法语句,则就不会跳回执行...程序工作如下:当你没有命令行参数情况下执行该程序,外面的try将产生一个被0异常。        ...程序在有一个命令行参数条件下执行,由嵌套try产生一个被0异常,由于内部catch不匹配这个异常,它将把异常传给外部try,在外部异常被处理。...finally创建代码try/catch完成之后另一个try/catch出现之前执行finally无论有没有异常抛出都会执行。...一个方法将从一个try/catch返回到调用程序任何时候,经过一个未捕获异常或者是一个明确返回语句,finally子句方法返回之前仍将执行

    1.2K90

    Java代码原来是这么执行—怒撕字节码指令

    invokevirtual指令要求将调用目标方法所需要参数压入栈顶,静态方法、类初始化方法之外,每个类成员方法以及类实例初始化方法第一个参数都是this引用,java...bipush之外还有将null放入操作数栈栈顶iconst_null指令、将常量池中常量值放入操作数栈顶指令ldc。...try-catch-finally final语意是如何实现为什么finally代码代码总能被执行到?...偏移量为32字节码指令是将异常存储到局部变量表索引为4Slot,这是因为执行finally代码之前需要将当前异常保存,以便于执行finally代码之后,将异常还原到操作数栈栈顶。...从这个例子中可以看出,编译器除了为try代码或者每个catch代码都添加一个异常项用于捕获任意受检异常跳转到finally代码执行之外,还把finally代码代码复制到try代码尾部,以及

    1K10

    java异常体系及1.7中try-with-resources

    1.5受检异常和非受检异常 受检异常:指Exception中RuntimeException之外所有异常,此类问题通常不是很严重,经过合适处理,程序还可以正常执行流程,因此java编译器会要求对此类异常进行处理...2.try、catch、finally处理java异常机制存在小问题 java中通常用 try、catch、finally语句对异常进行处理,在这个处理逻辑中,catch捕获到异常则可抛出,但是如果...catch捕获异常finally语句中也有新异常同时throw,则在调用该方法时,之前catch语句中throw异常会丢失。...finally语句exception。...3.try-with-resources jdk1.7中,对于异常处理,尤其是对于资源释放等场景try、catch、finally执行时,可以通过try-with-resources进行处理。

    75510

    Java入门(11)-- 异常处理

    Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,然后处理该异常,也可以将异常向上抛出,由方法调用者来处理。 11.2.1 错误 异常产生,如果不做任何处理,程序就会被终止。...其中,try语句存放是可能发生异常Java语句;catch程序try语句之后,用来激发被捕捉异常;finally语句是异常处理结构最后执行部分,无论try语句代码如何退出,都将执行...2. finally语句 完整异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之间try-catch是否顺利执行完毕,都会执行finally语句。...4种finally不会被执行情况: 1)finally语句中发生了异常; 2)在前面的代码中使用了System.exit()退出程序; 3)程序所在线程死亡; 4)关闭CPU。...Exception类又根据错误发生原因分为RuntimeException异常和RuntimeException之外异常。

    32330

    VMP处理SEH

    这一次,finally代码执行之后,Go标号之后代码将执行,因为tryfinally中都没有返回发生。这里代码使函数返回5。...为了确定是哪一种情况引起finally执行,可以调用内部函数 BOOL AbnormalTermination(); 这个内部函数只finally调用,返回一个Boolean值。...; } try中有一个指令试图以05。...int j=0; } } 1.SEHTest开始执行,进入它__try调用Sub_SEHTest 2.Sub_SEHTest开始执行,等到信标,然后0产生异常 3.系统因此取得控制,开始搜索一个与...从而执行finally 7.finally中包含代码执行完之后,系统继续上溯,查找需要执行未完成finally。在这个例子中已经没有这样finally了。

    1.6K33

    Java基础-异常机制

    执行catch后边代码 情况3:try中代码出现异常, catch中异常类型不匹配 不执行catch代码,不执行catch后边代码,程序会中断运行 注意 出现异常,Java会生成相应异常对象...,Java系统,寻找匹配catch,找到将异常对象付给catch异 常参数 出现异常,try中尚未执行语句不会执行 出现异常并处理,catch后面的语句还会执行 catch中如何处理异常...try-catch-finally try-catch加入finally,可以确保无论是否发生异常,finally代码总能被执行 无异常 try-finally 有异常 try-catch-finally...finally中语句不执行唯一情况 异常处理代码中执行System.exit(1)退出Java虚拟机 Finally具体执行过程 执行try或catch中代码 遇到return/throw,...子类声明异常范围不能超过父类声明范围 父类没有声明异常,子类也不能 不可抛出原有方法抛出异常类父类或上层类 手动抛出异常throw Java异常类对象程序执行过程中出现异常时由系统自动生成并抛出

    48220

    【148期】最最最全面的Java异常面试及解答

    finally一般作用在try-catch代码中,处理异常时候,通常我们将一定要执行代码方法finally代码中,表示不管是否出现异常,该代码都会执行,一般用来存放一些关闭资源代码。...注意: finally 中改变返回值做法是不好,因为如果存在 finally 代码,try中 return 语句不会立马返回调用者,而是记录下返回值待 finally 代码执行完毕之后再向调用者返回其值...1.1 使用 finally 代码 与前面几行 try 代码不同,finally 代码总是会被执行。不管 try 代码成功执行之后还是你 catch 代码中处理完异常都会执行。...大多数 Java 标准资源都继承了这个接口。当你 try 子句中打开资源,资源会在 try 代码执行或异常处理自动关闭。...说明:tryreturn语句执行成功,并不马上返回,而是继续执行finally语句,如果此处存在return语句,则在此直接返回,无情丢弃掉try返回点。

    57620

    教妹学 Java 第 42 讲:try-catch-finally

    ,用来捕获不同类型异常并做相应处理,当 try 某一行代码发生异常时,之后代码就不再执行,而是会跳转到异常对应 catch 执行。..."); } System.out.println("try-catch 之外"); } 这段代码执行时候,第一个 catch 执行,因为除数为零;我再来稍微改动下代码。...try { // 可能发生异常代码 }catch { // 异常处理 }finally { // 必须执行代码 } 没有 try-with-resources 之前,finally...try 有 return,finally 也会执行"); } } 来看一下输出结果: 即使 try 有 return,finally 也会执行 “那,会不会有不执行 finally...执行了 System. exit() 这行代码。 System.exit() 和 return 语句不同,前者是用来退出程序,后者只是回到了上一级方法调用

    39510

    0开始Python学习016异常

    控制台写了一段无效代码,将print()括号去掉,执行这条语句时候,系统提示语法错误,无效语句(我百度翻译)。这就是错误处理器所作工作。 再换一种方式写错误: ?...我们通常把容易产生异常语句放置try中,把做异常处理语句放在except中。...我们把所有可能引发错误语句放在try中,然后except从句/中处理所有的错误和异常。except从句可以专门处理单一错误或异常,或者一组包括圆括号内错误/异常。...try...finally ---- 假如在你读文件时候发生了异常,但是无论如何文件都要关闭。这个时候该怎么做呢? 这里我们需要使用finally来完成。...使用try捕获异常时候,我们可以同时使用exceptfinally

    63330

    Python 中异常处理

    异常原因通常在程序本身之外。例如,不正确输入、输入输出设备故障等。由于程序遇到异常时会突然终止,因此可能会对系统资源(如文件)造成损害。因此,应该正确处理异常,以防止程序突然终止。...如果异常类型与任何异常都不匹配,它将保持未处理状态,程序将终止。 之后其余语句将继续执行,不管是否遇到异常。 下面的示例将在我们试图用字符串来设计整数时引发异常。...但是,如果 try 中有异常,将处理适当 except ,并且继续执行代码其余部分之前,将处理 finally 语句。 下面的示例接受来自用户两个数字并执行它们除法。...Copy 第二次运行是被零情况,因此,执行 except finally ,但不执行 else 。...Copy 第三次运行情况下,出现了一个未捕获异常。final 仍然被执行,但是程序终止,并且 final 之后不执行程序。

    22820

    Java基础10:全面解读Java异常

    }finally { System.out.println("我所在catch没有执行,我也不会执行"); } } } //方法声明中抛出异常必须由调用方法处理或者继续往上抛...2、同一try…catch…finally中 ,如果try中抛出异常,且有匹配catch,则先执行catch,再执行finally。...如果没有catch匹配,则先执行finally,然后去外面的调用者中寻找合适catch。...3、同一try…catch…finally中 ,try发生异常,且匹配catch中处理异常时也抛出异常,那么后面的finally也会执行:首先执行finally,然后去外围调用者中寻找合适catch...也就是说:try…catch…finallyreturn 只要能执行,就都执行了,他们共同向同一个内存地址(假设地址是0×80)写入返回值,执行将覆盖先执行数据,而真正被调用者取返回值就是最后一次写入

    49720

    Java异常面试题(2020最新版)

    finally一般作用在try-catch代码中,处理异常时候,通常我们将一定要执行代码方法finally代码中,表示不管是否出现异常,该代码都会执行,一般用来存放一些关闭资源代码。...注意: finally 中改变返回值做法是不好,因为如果存在 finally 代码,try中 return 语句不会立马返回调用者,而是记录下返回值待 finally 代码执行完毕之后再向调用者返回其值...1.1 使用 finally 代码  与前面几行 try 代码不同,finally 代码总是会被执行。不管 try 代码成功执行之后还是你 catch 代码中处理完异常都会执行。...大多数 Java 标准资源都继承了这个接口。当你 try 子句中打开资源,资源会在 try 代码执行或异常处理自动关闭。 ...说明:tryreturn语句执行成功,并不马上返回,而是继续执行finally语句,如果此处存在return语句,则在此直接返回,无情丢弃掉try返回点。

    78030
    领券