zoukankan      html  css  js  c++  java
  • Error handling in Swift does not involve stack unwinding. What does it mean?

    Stack unwinding is just the process of navigating up the stack looking for the handler. Wikipedia summarizes it as follows:

    Some languages call for unwinding the stack as this search progresses. That is, if function f, containing a handler H for exception E, calls function g, which in turn calls function h, and an exception E occurs in h, then functions h and g may be terminated, and H in f will handle E.

    Whereas a Swift error doesn't unwind the stack looking for a handler. It just returns, and expects the caller to handle the thrown error. In fact, the sentence after the one you quote goes on to say:

    As such, the performance characteristics of a throw statement are comparable to those of a return statement.

    So, using that first example, where f called g which calls h, in Swift, if you want f to catch the error thrown by h, then:

    • h must explicitly be marked that it throws errors;
    • g must explicitly try its call to h;
    • g must also be marked that it throws errors, too; and
    • f must explicitly try its call to g

    In short, while some other languages offer stack unwinding in the process of finding the exception handler, in Swift error handling, you must either explicitly catch the error thrown by functions you try, or be designated as a function that throws so that failed try calls will be thrown back up to the caller. There is no automatic unwinding of the stack in Swift. 

    All of this is unrelated to the question of whether deallocation takes place. As you've seen, yes, the throw in Swift behaves much like return, deallocating those local variables.

    It's worth noting that not all exception handling that involves stack unwinding does the deallocation. Generally it does (because of course we want it to clean up when we're handling exceptions), but for example, "the GNU C++ unwinder does not call object destructors when an unhandled exception occurs. The reason for this is to improve debuggability." (From Exception Handling in LLVM.) Clearly, that's only appropriate for unhandled exceptions in debugging environments, but it illustrates the issue that unwinding the stack doesn't necessarily mean that objects are deallocated.

    https://stackoverflow.com/questions/46814233/error-handling-in-swift-does-not-involve-stack-unwinding-what-does-it-mean

  • 相关阅读:
    Java并发编程:线程池的使用
    java动态代理实现与原理详细分析
    Springmvc 横向源码原理解析(原创)
    spring事物配置,声明式事务管理和基于@Transactional注解的使用
    Spring IoC的原理为什么是反射而不是new
    Mybatis源码分析(原创)
    Springboot中做定时任务 和 Springboot API 分页
    python程序入门 基础教程
    本地的jar包添加到maven库中 jdbc举例
    基于接口隔离原则的依赖注入实现
  • 原文地址:https://www.cnblogs.com/feng9exe/p/11252330.html
Copyright © 2011-2022 走看看