Swift中可以通过Error协议自定义错误信息
例如下面这种错误场景:
![](https://img-blog.csdnimg.cn/img_convert/8f3abfc16b1fafa2021decd0619d772e.png)
01.png
可以通过自定义Error错误信息来抛出异常,Error信息可以定义为类
、枚举
、结构体
三种形式,用法如下所示:
class ClassError: Error {
var msg : String
init(msg: String) {
self.msg = msg
}
}
enum EnumError : Error {
case msg(String)
case outOfBounds(Int , Int)
case outOfMemory
// ......
}
struct StructError: Error {
var msg : String
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var result = try? divide(20, 0)
print(result)
func divide(_ num1: Int, _ num2: Int) throws -> Int {
if num2 == 0 {
throw ClassError.init(msg: "0不能作为除数")
// throw EnumError.msg("0不能作为除数")
// throw StructError(msg: "0不能作为除数")
}
return num1 / num2
}
// func test() {
// do {
// let result = try divide(20, 0)
// print(result)
// } catch let EnumError.msg(errorMsg) {
// print("0不能作为除数\(errorMsg)")
// } catch let EnumError.outOfBounds(size, index) {
// print("下标越界\(size) \(index)")
// } catch EnumError.outOfMemory {
// print("内存溢出")
// } catch {
// print("其它错误")
// }
// }
}
}
如果分母传入0,则会出现下列错误:
![](https://img-blog.csdnimg.cn/img_convert/e5682f9de5e70ea97baaac0f5b1ca678.png)
02.png
- try! : 如果发生错误, 程序会崩溃. 不推荐使用,此时对于这种崩溃,我们可以使用
do-catch
来捕捉,用法如下所示:
do-catch
用法一:
![](https://img-blog.csdnimg.cn/img_convert/a457c996493409f817ec72f6bb9ad322.png)
03.png
do-catch
用法二:
![](https://img-blog.csdnimg.cn/img_convert/f0fc679a051a48455920c250846a764e.png)
04.png
do-catch
用法三:
![](https://img-blog.csdnimg.cn/img_convert/67e04e1e5b6113f31146204bc0261f03.png)
05.png