如何在iOS中尝试/捕获此类错误

时间:2016-11-05 15:05:11

标签: ios try-catch swift3

我有一些代码

    captureSession = AVCaptureSession()
    captureSession!.sessionPreset = AVCaptureSessionPresetPhoto
    let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) etc...

当然,这在模拟器上无法正常工作。没问题。

如果你在模拟器上运行它,它就会在这里正确崩溃

    captureSession!.sessionPreset = AVCaptureSessionPresetPhoto
像这样

enter image description here

作为好奇心,你会如何“抓住”那次崩溃?

如果我尝试以不同的方式“尝试”它,

    try captureSession!.sessionPreset = AVCaptureSessionPresetPhoto

我只得到......

  

/ Users / jpm / Desktop / development / - / classes / CameraPlane.swift:67:3:在'try'表达式中没有调用抛出函数

你是如何包装和捕捉这种类型的电话的?

对于任何专门处理相机烦恼的人来说,只需顺便说一句,

func cameraBegin()
    {
    captureSession = AVCaptureSession()

    if ( AVCaptureDevice.devices().count == 0 )
        {
        print("Running on simulator.")
        return
        }
    ...

2 个答案:

答案 0 :(得分:2)

try只能在调用throws的函数时使用。这些函数明确标有throws

如果你想安全打开一个可选项(我猜你想要实现的目标),你可以使用guard

var number: Int?
guard let unwrappedNumber = number else {
    return
}
print("number: \(unwrappedNumber)")

答案 1 :(得分:2)

不幸的是,EXC_BAD_ACCESS意味着抓住任何东西为时已晚,因为程序将会停止。

您只能“捕获”您使用的语言/运行时提供的异常。这将是swift中的错误对象(或带有NSError**参数的OjbC方法),obj-c您可以捕获@try/@catch块的异常(但它们会破坏内存管理,不应该用于运行时错误处理)或C ++例外。

到目前为止,swift / objc由于多种原因没有NullReferenceException的概念,但在访问已释放/无效的内存时也会出现EXC_BAD_ACCESS,这是常见的编程错误在ObjC ARC和swift之前。因此,只有防止访问“0”内存地址才有助于这些情况。任何对此的处理都必须处理上述三种错误/异常处理机制并可能破坏内存管理(与Java / .NET不同,没有垃圾收集器可以清除执行意外非执行后遗留的所有对象 - 本地回归)。

因此,“坏”内存访问的处理不受任何保护,并且会导致立即崩溃而无法以合理的方式进行恢复。因此,您唯一能做的就是执行运行时检查,如果您要执行的操作有效并谨慎使用“bang”(!)运算符。