需要配合 do-catch
使用,否则编译不过,如下面的代码,就无法编译通过
let path = "不存在的文件路径"
try FileManager.default.removeItem(path)
如果要编译通过,可以这样
let path = "不存在的文件路径"
do {
try FileManager.default.removeItem(path)
return true // 表示删除成功
} catch let error {
print(error)
return false // 表示删除失败
}
try?
一般不需要通过 do-catch
包裹。一般我们不关注错误原因时,可以用 try?
,代码更整洁。例如:
let path = "不存在的文件路径"
try? FileManager.default.removeItem(path)
当然,如果我们想根据执行结果来判断后续流程,也是可以的,只是方法 removeItem
没有返回值,对于有返回值的,一般这样写:
let jsonString = "{\"name\"::\"zhangsan\"}" // 很显然,json字符串多了一个冒号
let data = jsonString.data(using: .utf8)
// 这一句,判断json解析的结果是否有值,如果为nil,就直接返回了,不会执行到下面 print 语句
guard let json = try? JSONSerialization.jsonObject(with: data!, options: []) else { return }
print("---------------\(json)")
对于调用可能抛出异常的方法,不能使用 try!
,否则程序会崩溃,例如:
let path = "不存在的文件路径"
try! FileManager.default.removeItem(path)
即使用 do-catch
包裹,也是会崩溃的,如
let path = "不存在的文件路径"
do {
try! FileManager.default.removeItem(path)
} catch let err {
// IDE提示该方法不会被调用,所以也就捕捉不到错误了
}
以上三种方法并不能处理所有的崩溃,比如数组下标越界,这种是不会抛异常的,即使用 do-catch
包裹,也依然会崩溃。
let list = [1, 2]
do {
try list[2] // 仍然会崩溃在这一行
} catch let err {
print(error)
}