Call can throw, but errors can not be thrown out of a global variable initializer

If you know that your function call will not throw an exception, you can call the throwing function with try! to disable error propagation. Note that this will throw a runtime exception if an error is actually thrown.

let recorder = try! AVAudioRecorder(URL: soundFileURL, settings: recordSettings as! [String : AnyObject])

Source: Apple Error Handling documentation (Disabling Error Propagation)


There are 3 ways that you can use to solve this problem.

  • Creating optional AVAudioRecorder using try?
  • If you know that it will return you AVRecorder, you can implicity use try!
  • Or then handle the error using try / catch

Using try?

// notice that it returns AVAudioRecorder?
if let recorder = try? AVAudioRecorder(URL: soundFileURL, settings: recordSettings) { 
    // your code here to use the recorder
}

Using try!

// this is implicitly unwrapped and can crash if there is problem with soundFileURL or recordSettings
let recorder = try! AVAudioRecorder(URL: soundFileURL, settings: recordSettings)

try / catch

// The best way to do is to handle the error gracefully using try / catch
do {
    let recorder = try AVAudioRecorder(URL: soundFileURL, settings: recordSettings)
} catch {
    print("Error occurred \(error)")
}

Tags:

Swift

Swift2