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