swift 中错误处理
- 1. 开发环境说明
- 2. 自定义错误类型
- 3. try?的使用方式
- 4. do...catch的使用
- 5. try!的使用方式
- 6. defer的使用
- 7. 养眼图片一张
1. 开发环境说明
系统版本:macOS Catalina 10.15.4
Xcode版本: Version 11.5 (11E608c)
swift版本: Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53).
2. 自定义错误类型
enum CustomError: Error{
case Error1
case Error2
case Error3(param:String)
}
3. try?的使用方式
定义一个测试用的类
class TestErrorClass {
var name:String
init(s:String) throws {
guard !s.isEmpty else {
throw CustomError.Error1
}
name = s;
}
func showString(){
print("name:\(self.name)")
}
}
第一种使用方式,运行代码后,直接抛出异常,中止运行:
let tes = try TestErrorClass(s:"")
运行结果:
__lldb_expr_123.CustomError.Error1
第二种使用方式,将try换成try? 运行代码后,tes返回nil,后续代码继续运行:
let tes = try? TestErrorClass(s:"")
if tes == nil {
print("ERROR:tes is nil.")
} else {
tes?.showString()
}
运行结果:
ERROR:tes is nil.
4. do…catch的使用
修改一下TestErrorClass,让其抛出的异常使用带参数的Error3
class TestErrorClass {
var name:String
init(s:String) throws {
guard !s.isEmpty else {
throw CustomError.Error3(param: "名字不能为空")
}
name = s;
}
func showString(){
print("name:\(self.name)")
}
}
do{
let tes = try TestErrorClass(s:"")
tes.showString()
} catch CustomError.Error1{
print("CustomError.Error1")
} catch CustomError.Error2{
print("CustomError.Error2")
} catch CustomError.Error3(let str){
print("CustomError.Error3: \(str)")
}
当执行到 let tes = try TestErrorClass(s:"") 这行语句时,产生了异常,直接跳转到catch 去匹配一致的错误类型后,执行对应的代码断.运行结果如下:
CustomError.Error3: 名字不能为空
如果不需要做类型区分处理,可以用以下方式:
do{
let tes = try TestErrorClass(s:"")
tes.showString()
} catch is CustomError {
print("CustomError...")
}
这种情况下只要属于CustomError都会执行到该分支代码,运行结果如下:
CustomError...
如果将try?加到do…catch 会如何呢,其实就相当于永完不会catch到异常一样,因为直接返回nil值了,系统也会给给出警告提示.
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200605164855962.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1YW53ZW5jaGFv,size_16,color_FFFFFF,t_70)
5. try!的使用方式
当有些异常在测试代码时是已经知道的,并且不想带有提示和警告,可以使用try! 慎用。。。
比如上面的例子,调用TestErrorClass的地方是一个函数,这样的放在,这个函数也要定义为可能抛出异常
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200605165722797.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1YW53ZW5jaGFv,size_16,color_FFFFFF,t_70)
如果你非常确定这个 TestFunc在正式环境使用中,是不可能产生异常的,那可以改为下面这样:
func TestFunc(){
let tes = try! TestErrorClass(s:"")
tes.showString()
}
TestFunc()
6. defer的使用
使用 defer语句,可以保证在代码执行完离开当前代码块前最后执行的语句合集,包括有异常产生的情况.
enum FileError:Error {
case File_Read_Error
}
class TestErrorClass {
func readLine()throws ->String{
throw FileError.File_Read_Error
}
func readFile(filename:String) throws -> String{
let manager = FileManager.default
let document = manager.urls(for: .documentDirectory, in: .userDomainMask)
let pathstr = document[0].appendingPathComponent(filename)
print(pathstr)
print("打开文件........")
defer {
print("defer: 关闭文件.")
}
print("读取文件........")
do {
try readLine()
} catch is FileError{
print("读取文件发生了异常.")
}
return "读取的全部内容"
}
}
let t = TestErrorClass()
let c = try? t.readFile(filename: "abc.txt")
执行结果如下:
file:///Users/xuanwenchao/Library/Developer/XCPGDevices/01FCF58C-8F84-47B7-9487-F825A5A0D4D3/data/Containers/Data/Application/C5A3BCA5-D5BB-49B3-9DEE-098EB836C3A4/Documents/abc.txt
打开文件........
读取文件........
读取文件发生了异常.
defer: 关闭文件.
7. 养眼图片一张
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200605174529937.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3h1YW53ZW5jaGFv,size_16,color_FFFFFF,t_70)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)