Swift中的以下代码引发NSInvalidArgumentException异常:
task = NSTask()
task.launchPath = "/SomeWrongPath"
task.launch()
Run Code Online (Sandbox Code Playgroud)
我该如何捕捉异常?据我所知,Swift中的try/catch是针对Swift中抛出的错误,而不是针对像NSTask这样的对象引发的NSExceptions(我猜这是用ObjC编写的).我是Swift的新手,所以可能是我错过了一些明显的东西......
编辑:这是一个关于bug的雷达(特别是对于NSTask):openradar.appspot.com/22837476
在Objective-C,我调用该NSSetUncaughtExceptionHandler(&exceptionHandler)方法来记录异常.它如何在Swift中调用?
我正在基于这篇博文建立一些基本的崩溃记录系统(是的,我知道PLCRashReporter,不,我不能使用它,需要自己动手,但是有限.谢谢).
我的代码为大多数信号注册了异常处理程序(with NSSetUncaughtExceptionHandler())和信号处理程序:
SIGQUIT
SIGILL
SIGTRAP
SIGABRT
SIGEMT
SIGFPE
SIGBUS
SIGSEGV
SIGSYS
SIGPIPE
SIGALRM
SIGXCPU
SIGXFSZ
Run Code Online (Sandbox Code Playgroud)
它似乎与基本的Objective-C东西很好地工作,例如"无法识别的选择器发送到实例......"等.
接下来,我尝试使用以下Swift代码:
var empty:String! = nil
let index = empty.startIndex // < KA-BOOM!
Run Code Online (Sandbox Code Playgroud)
...但是EXC_BAD_INSTRUCTION没有捕获抛出的异常(我的处理程序没有被调用),而是我熟悉了:
致命错误:在展开Optional值时意外发现nil
...在Xcode控制台中.
我错过了什么?
这个答案说可以处理这种运行时错误SIGTRAP; 但是我已经在处理那个信号而且似乎没有用.
ADDENDUM:似乎没有针对Swift运行时错误的集中式异常处理系统(越界,nil unwrap等); 看这篇文章.但是,Xcode仍然可以崩溃EXC_BAD_INSTRUCTION,所以我的问题是:这怎么可能,为什么我的信号处理程序不能处理这个?
附录2:为了安全起见,我尝试为signal.h中定义的所有 20多个信号注册我的信号处理程序(不仅仅是上面列出的信号); 仍然没有变化.
附录3: Apple的官方文档了解和分析应用程序崩溃报告包含以下代码段:
跟踪陷阱[EXC_BREAKPOINT // SIGTRAP]
与异常退出类似,此异常旨在使附加调试器有机会在其执行的特定点中断进程.您可以使用__builtin_trap()函数从您自己的代码中触发此异常.如果未附加调试器,则终止该过程并生成崩溃报告.
较低级别的库(例如,libdispatch)将在遇到致命错误时捕获该进程.有关错误的其他信息,请参见崩溃报告的"其他诊断信息"部分或设备的控制台中.
如果在运行时遇到意外情况,则Swift代码将以此异常类型终止,例如:
- 具有nil值的非可选类型
- 强制类型转换失败
查看Backtraces以确定遇到意外情况的位置.其他信息也可能已记录到设备的控制台.您应该修改崩溃位置的代码以正常处理运行时故障.例如,使用Optional Binding而不是强制解包可选. …