swift抛出异常_Swift-异常处理

跟其它语言一样,Swift的异常处理是在程序抛出异常后的处理逻辑。 Swift提供了一流的异常抛出、捕获和处理的能力。跟Java语言类似, Swift的异常并不是真正的程序崩溃, 而是程序运行的一个逻辑分支;Swift和Java捕获异常的时序也是一样的。当Swift运行时抛出异常后并没有被处理, 那么程序就会崩溃。

在Swift语言中使用Error表示异常, 作用同Java的Exception类或Object-C的NSError类。

苹果建议使用枚举作为异常类型(为什么不推荐用类或者结构体?答案是枚举数据类型本身就是分成若干种情况,很适合做逻辑分支判断条件)。Swift提供了try、try?、try!、catch、throw、throws关键字处理异常逻辑。

1.定义枚举异常值

enum VendingMathineError: Error{

case invalidSelection

case insufficientFunds(coinsNeed: Int)

case outOfStack

}

复制代码上面声明了枚举类型VendingMathineError,继承于Error。 注意Swift的所有异常类型都继承于Error。

抛出异常(throws)

我们可以在方法中抛出异常,定义抛出异常的方法很简单,只需要在返回值的 -> 前面加上throws就好了。示例如下:

func canThrowErrors() throws -> String {

if type == 1 {

throw VendingMathineError.invalidSelection

}

if type == 2 {

throw VendingMathineError.outOfStack

}

if type == 3 {

throw VendingMathineError.insufficientFunds(coinsNeed: 100)

}

return "success"

}

复制代码

3.捕获异常(catch)

do {

try canThrowAnError()

// 没有错误消息抛出

} catch {

// 有一个错误消息抛出

}

复制代码注意:如果try语句抛出异常则会跳出do代码块,并按顺序逐个catch,当一个catch捕获成功后,后面的catch不再执行。

4.不处理异常(try? & try! )

try?

try?会将错误转换为可选值,当调用try?+函数或方法语句时候,如果函数或方法抛出错误,程序不会发崩溃,而返回一个nil,如果没有抛出错误则返回可选值。// 查询所有数据方法

func findAll() throws -> [Note] {

guard listData.count > 0 else {

// 抛出"没有数据"错误。

throw DAOError.NoData

}

return listData

}

let datas = try? findAll()

print(datas)

复制代码上述代码中let datas = try? findAll()语句中使用了try?,datas是一个可选值,本例中输出nil。使用了try?语句没有必要使用do-catch语句将其包裹起来。

try!

使用try!可以打破错误传播链条。

错误抛出后传播给它的调用者,这样就形成了一个传播链条,但有的时候确实不想让错误传播下去,可以使用try!语句。

复制代码// 查询所有数据方法

func findAll() throws -> [Note] {

guard listData.count > 0 else {

//抛出"没有数据"错误。

throw DAOError.NoData

}

return listData

}

func printNotes() {

let datas = try! findAll()

for note in datas {

print("date : \(note.date!) - content: \(note.content!)")

}

}

printNotes()

复制代码代码printNotes()函数没有声明抛出错误,在调用它的时候不需要try关键字,错误传播链条在printNotes()函数内被打破了。

代码将try dao.findAll()语句改为try! findAll(),在try后面加了感叹号(!),这样编译器就不会要求printNotes()方法声明抛出错误了,try!打破了错误传播链条,但是如果真的发生错误就出现运行期错误,导致程序的崩溃。

所以使用try!打破错误传播链条时,应该确保程序不会发生错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值