Swift中的运行时错误处理

Orl*_*iev 17 signals runtime exception handle swift

我完全清楚Swift没有try/catch机制来捕获异常(好的,Swift 2.0现在支持它们).我也理解许多API方法会返回一个NSError,如果出现问题,它将填充错误对象.所以请不要指出这个问题:Swift语言中的错误处理

但是这仍然没有解释如何对自己的代码中的运行时错误作出反应,例如数组越界访问或强制解包一个nil的可选值.例如:

var test: String?
test = nil
println(test!) //oops!
Run Code Online (Sandbox Code Playgroud)

要么

var arr = [0,1,2]
for i = 0...3 {
    println(arr[i]) //oops!
}
Run Code Online (Sandbox Code Playgroud)

每个程序员偶尔会犯这样的错误,应该有一种方法至少记录它们以供以后分析.在调试时,Xcode可以向我们展示这些,但如果最终用户或beta测试人员遇到这种情况怎么办?在纯C中有信号处理,它也可以在Objective-C中使用.在Swift中有这样的东西吗?在应用程序死亡之前输入的集中回调?

更新:

让我重新解释一个问题:在一个大项目中,在每个循环和强制解包时手动检查上述错误是不可行的.当运行时错误最终确实发生时,是否会有一个回调,比如Objective C的segfault处理或NSSetUncaughtExceptionHandler,它会被调用,以便错误可以与崩溃的堆栈跟踪一起记录/通过电子邮件发送?

cod*_*ter 1

编辑:这个答案没有随 swift 2.0 更新。由于 swift 现在有错误处理功能,我还没有更新下面的答案。错误处理的某些方面将在未来使用 swift 3.0 进行更新。您可以按照这个答案Error-Handling in Swift-Language

\n\n

Swift 是一种typeSafe语言。它在编译时出错,而不是等待在运行时出错。

\n\n

在第一个示例中,您使用的是Optional.

\n\n
var test: String?\n
Run Code Online (Sandbox Code Playgroud)\n\n

首先理解 的含义optional。当您指定时optional,您说它可能是nil or have no value。现在,当您打开包装时,test您说的是我知道这个值是not nil。请打开它,我对此很确定。所以您有责任查看它在哪里nil。如果您不知道确定这一点,您应该在此处使用可选绑定。当您不确定值时,请始终使用 if 条件 whileunwrrapping

\n\n
  if let notNilTest = test {\n    //use notNilTest\n  }\n  else{\n   //handle error\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

在第二个示例中,进行运行时异常处理应该是有意义的,但是您可以使用if具有计数的条件轻松获得此值。因此,在第二个示例中,作为开发人员,您应该使用 if 条件来获取count数组。

\n\n

来自快速指南:

\n\n
\n

如果您尝试使用下标语法检索或设置超出数组\xe2\x80\x99 现有范围的索引值,\n 将触发运行时错误。但是,您可以在使用索引之前通过将其与数组 xe2x80x99s 计数属性进行比较来检查索引是否有效。除非 count 为 0(表示数组为空),否则数组中最大的有效索引将始终为 count - 1,因为数组是从零开始索引的。

\n
\n\n

他们清楚地提到了这一点,你应该注意这些事情,以减少你的代码的错误。他们提供了一些东西,我们应该知道如何使用这些东西。

\n

  • 这基本上意味着“你通过不做任何错误来处理错误”。这些示例非常简单,但在 50000 行的项目中,在每个循环和强制展开上检查这些示例是不可行或不美观的。最终会发生运行时错误。然后呢? (6认同)
  • Objective C 有信号处理和 NSSetUncaughtExceptionHandler。Java有Thread.setDefaultUncaughtExceptionHandler。C# 有 AppDomain.UnhandledException。请注意,这些不是 try/catch 块,而是集中处理程序,以防其他所有方法都失败。为什么 Swift 中没有这样的东西?它并不比 Java 或 C# 更安全 (5认同)
  • @OrlinGeorgiev - 一定有一种我相信的方法,因为 Crittercism 报告了我的 swift 应用程序中发生的所有崩溃。 (2认同)