当前位置: 首页 > 面试题库 >

Swift 2.0 do-try-catch和常规Java / C#/ C ++异常之间有什么区别

柳俊健
2023-03-14
问题内容

Swift 2.0似乎已经从运行时错误处理的传统ObjC(返回NSError)和Swift 1.X(成功/失败可选)约定转变为类似于Java / C#/ C
++ / etc等语言中的异常处理的约定。

苹果公司传统上强调使用NSError而不是抛出NSException for runtime errors(相对于程序员错误),因为NSException使用默认的ObjC编译器设置,展开堆栈可能会导致内存泄漏

但是现在他们设计出了与传统例外非常相似的东西。我的问题是:

除了 命名法 (错误与异常)和 语法 (do-catch,而不是try-catch,在方法调用之前尝试使用,等等)之外,Swift
2.0错误处理与传统异常处理之间是否存在任何实际区别。


问题答案:

我发现了3个主要差异:

  1. 不必列出功能可能引发的所有错误,只throws需要一个关键字即可。

  2. 使用这些错误时,速度没有明显的下降,而Java和其他语言则需要构造一个Exception对象并展开堆栈。在Swift中,throws可以将关键字视为返回Either-object 的函数,其中一个是原始返回类型,另一个是ErrorType值。

  3. 在Swift中,所有错误都需要处理或声明为抛出,因此无法从未声明正在抛出错误的方法中获取错误。(用Java术语来说,所有错误都是“检查过的异常”)



 类似资料:
  • 问题内容: 如何区分Java中的错误和异常? 问题答案: 错误“表示合理的应用程序不应尝试捕获的严重问题”。 而 异常“指示合理的应用程序可能想要捕获的条件”。 错误及其子类都是例外。所有其他异常类都是异常。 检查 异常通常是程序可以从中恢复的异常,最好以编程方式从此类异常中恢复。示例包括,等。希望程序员使用try- catch块检查这些异常,或者将其扔回调用方。 另一方面,我们有 未经检查的 异

  • C++ 异常处理用于错误检测函数无法处理错误的情况。这种函数抛出异常(throw an exception),但不能保证有相关的异常处理器。如果有,则异常处理器捕获和处理这个异常。如果没有该类异常相关的异常处理器,则程序终止。 程序员在try块中放上出错时产生异常的代码。try块后面是一个或几个catch块。每个catch块指定捕获和处理一种异常,而且每个catch块包含一个异常处理器。如果异常与

  • 问题内容: 在Java中,如果特定的代码行导致程序崩溃,则将捕获异常并继续执行程序。 但是,在C ++中,如果我有一段导致程序崩溃的代码,例如: 然后程序仍然崩溃,并且没有捕获到异常。 那么C ++中异常处理的意义是什么?我误会了吗? 问题答案: 崩溃的行正在取消引用无效的指针。在C ++中,这不会引发异常。相反,它是未定义的行为。 C ++中不存在空指针异常,这与Java会抛出空指针异常不同。相

  • 我有一个使用JSoup连接和解析网站数据的程序。当网站在我给出的10秒超时后无法连接时,JSoup方法会抛出一个Uncheck edIOException。这可能包含一个IOException,例如“SSL Peer意外关闭”或“超时”,这是我过去处理过的IOExceptions。这很奇怪,因为它包含一个try catch: 我已经做了各种变通方法,比如在try-catch中包装该方法,使该方法抛

  • 问题内容: 我对python级别的函数和常规函数(用定义)之间的差异感到好奇。(我知道对程序员有什么区别,以及何时使用每个程序员。) 如我们所见-python 知道 这是一个函数,并且是一个常规函数。这是为什么?它们 与python有 什么区别? 问题答案: 它们是同一类型,因此它们的处理方式相同: Python还知道将其定义为lambda函数,并将其设置为函数名称: 换句话说,它影响了该函数将获

  • 我一直在收到com。谷歌。格森。JsonSyntaxException无法调用Gson。fromJson(),因此添加了一个捕获(异常)逻辑,但错误永远不会被捕获,而只是被抛出! 这是我所拥有的: 运行测试时,我得到“com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为BEGIN\u对象,但在第1行第1列路径$