如何在swift中抛出并处理错误?

时间:2015-07-13 03:13:24

标签: swift

这是我的代码(Swift):

import UIKit
import AVFoundation
class PlaySoundViewController: UIViewController {
   override func viewDidLoad() {
   super.viewDidLoad()
   // Do any additional setup after loading the view.
   if var filePath = NSBundle.mainBundle().pathForResource("movie_quote",ofType: "mp3"){
      var filePathUrl = NSURL.fileURLWithPath(filePath)
      AVAUdioPlayer audioPlayer = AVAudioPlayer(contentsOfURL:filePathUrl) throws
   }
   else{
      print("filePath is empty")
   }
}
@IBAction func playSlowAudio(sender: UIButton) {
}
func didReceiveMemoryWarning() {
   super.didReceiveMemoryWarning()
   // Dispose of any resources that can be recreated.
   }
}

这是我在“文档和API参考”中找到的播放音频的方法: ``

initWithContentsOfURL:error:
init(contentsOfURL url: NSURL) throws

因此,我返回一个String作为源路径,然后将其转换为NSURL。现在我想播放音频,但我使用的方法需要抛出错误并处理它。我应该如何抛出并处理错误?

2 个答案:

答案 0 :(得分:3)

Swift 2.0

如果初始化程序失败,

AVAudioPlayer将抛出异常。通过将其初始化包装在do / catch子句中来捕获错误。

do {
    let audioPlayer = try AVAudioPlayer(contentsOfURL: filePathUrl)
    // use audioPlayer
} catch {
    // handle error
}

如您所见,在任何可以抛出异常的方法调用之前插入关键字try。只要try语句不是throw,您就可以正常继续使用代码。如果try语句为throw,则程序将跳转到catch子句。

检查错误

如果您想检查错误,可以通过编写NSError语句(如Apple's Objective-C/Swift Interoperability Docs中所示)将其转换为catch

do {
    let audioPlayer = try AVAudioPlayer(contentsOfURL: filePathUrl)
    // use audioPlayer
} catch let error as NSError {
    // error is now an NSError instance; do what you will
}

只有在想要检查Apple的一个Cocoa对象引发的错误时,才需要转换为NSError。原生Swift代码,抛出原生ErrorType错误,无需转换。

我建议你阅读Apple的new docs on error handling in Swift

Swift 1.2

如果您使用的是Swift 1.2,则无法使用错误处理。相反,AVAudioPlayer的初始化方法将失败并返回nil

如果您使用的是Swift 1.2,我建议您按照以下方式初始化音频播放器:

var initError: NSError?
if let audioPlayer = AVAudioPlayer(contentsOfURL: filePathUrl, error: &initError) {
    // use audioPlayer
} else {
    println(initError) // handle error
}

答案 1 :(得分:0)

从Swift 1.2开始,你不能抛出/处理异常。虽然它在swift2(需要XCode7支持)中可用,但仍处于测试阶段。有关详细信息,请参阅此文章(http://start-coding.blogspot.com/2015/07/android-development-in-windows-using.html)。