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,它会被调用,以便错误可以与崩溃的堆栈跟踪一起记录/通过电子邮件发送?
编辑:这个答案没有随 swift 2.0 更新。由于 swift 现在有错误处理功能,我还没有更新下面的答案。错误处理的某些方面将在未来使用 swift 3.0 进行更新。您可以按照这个答案Error-Handling in Swift-Language
\n\nSwift 是一种typeSafe
语言。它在编译时出错,而不是等待在运行时出错。
在第一个示例中,您使用的是Optional
.
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
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 归档时间: |
|
查看次数: |
3165 次 |
最近记录: |