Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception Swift中的运行时错误处理_Exception_Swift_Runtime_Signals_Handle - Fatal编程技术网

Exception Swift中的运行时错误处理

Exception Swift中的运行时错误处理,exception,swift,runtime,signals,handle,Exception,Swift,Runtime,Signals,Handle,我完全知道Swift没有捕捉异常的try/catch机制(好的,Swift 2.0现在支持它们)。我还知道,许多API方法返回一个NSError,如果出现问题,该NSError将被错误对象填充。所以请不要把这个问题告诉我: 但这仍然没有解释如何对自己代码中的运行时错误做出反应,例如数组越界访问或强制展开为零的可选值。例如: var test: String? test = nil println(test!) //oops! 或 每个程序员偶尔都会犯这样的错误,至少应该有一种方法来记录这些错误

我完全知道Swift没有捕捉异常的try/catch机制(好的,Swift 2.0现在支持它们)。我还知道,许多API方法返回一个NSError,如果出现问题,该NSError将被错误对象填充。所以请不要把这个问题告诉我:

但这仍然没有解释如何对自己代码中的运行时错误做出反应,例如数组越界访问或强制展开为零的可选值。例如:

var test: String?
test = nil
println(test!) //oops!

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

更新:


让我重新表述一下这个问题:在大型项目中,手动检查每个循环上的上述错误并强制展开是不可行的。当最终确实发生运行时错误时,是否会调用像Objective C的segfault handling或NSSetUncaughtExceptionHandler这样的回调函数,以便将错误与崩溃的堆栈跟踪一起记录/通过电子邮件发送?

编辑:此答案不会用swift 2.0更新。由于swift现在有错误处理,我没有更新以下答案。错误处理的某些方面将在将来使用swift 3.0进行更新。您可以按照此答案进行操作

Swift是一种类型安全的语言。它在编译时出错,而不是在运行时等待出错

在第一个示例中,您使用的是
可选

var test: String?
首先理解
optional
的含义。当您指定
optional
时,您是说它可能是
nil或没有值
。现在当您展开
test
时,您是说我知道这个值是
而不是nil
。请展开它,我确信这一点。因此,您有责任查看它在哪里
nil
。如果您对此不确定,则应在此处使用可选绑定。当您不确定值时,请在
unwrapping

  if let notNilTest = test {
    //use notNilTest
  }
  else{
   //handle error
  }
在第二个示例中,运行时异常处理应该是有意义的,但如果
if
条件具有count,则可以很容易地实现这一点。因此,在第二个示例中,作为开发人员,您应该使用if条件来获取数组的
count

来自swift指南:

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


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

考虑使用一个保护语句,而不是多个if-let

var arr = [0,1,2]
for i = 0...3 {
    Guard arr[i] != nil else {
        Continue
    }
    println(arr[i]) //oops!
}
或者代替

if let x = some value {
    If let y = someOtherVal {
        If let z = yetanotherVal {
            Product = x * y* z
        }
    }
}
其整洁程度远不及:

Let x = someVal
Let y = someOtherVal
Let z = yetAnotherVal

Guard x != nil,
  y != nil,
  z != nil
Else {
  Return
}

Product = x * y * z

这基本上意味着“通过不做任何错误来处理错误”。这些例子非常简单,但在一个50000行的项目中,检查每个循环和强制展开上的例子既不可行也不漂亮。最终会发生运行时错误。然后呢?如果您在实践中没有使用这些东西,那么让try-catch块处理所有这些异常是非常脆弱和不切实际的。您可以使用try/catch或If条件。由于错误处理及其有效的争议点,也会发生许多错误。但是,采取预防措施总是更好的客观的C信号处理和NSSetUncaughtExceptionHandler。Java有Thread.setDefaultUncaughtExceptionHandler。C#具有AppDomain.UnhandledException。请注意,这些不是try/catch块,而是集中式处理程序,以防其他所有操作都失败。为什么斯威夫特没有这样的东西?它并不比Java或C#@OrlinGeorgiev更安全——我也尝试过,但我找不到捕捉快速运行时错误的方法。但是Critercism确实捕捉到了它。你找到解决方案了吗?@OrlinGeorgiev-我一定有办法相信,因为Critercism报告了我的swift应用程序中发生的所有崩溃。
Let x = someVal
Let y = someOtherVal
Let z = yetAnotherVal

Guard x != nil,
  y != nil,
  z != nil
Else {
  Return
}

Product = x * y * z