相关疑难解决方法(0)

在Swift中捕获NSException

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

cocoa-touch exception foundation nsexception swift

65
推荐指数
3
解决办法
2万
查看次数

我应该如何在Swift中使用NSSetUncaughtExceptionHandler

在Objective-C,我调用该NSSetUncaughtExceptionHandler(&exceptionHandler)方法来记录异常.它如何在Swift中调用?

error-handling ios swift

19
推荐指数
4
解决办法
2万
查看次数

打开Nil时如何拦截EXC_BAD_INSTRUCTION

我正在基于这篇博文建立一些基本的崩溃记录系统(是的,我知道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而不是强制解包可选. …

signals exception-handling ios swift

8
推荐指数
1
解决办法
1218
查看次数