错误处理(Error Handling)

错误处理的概念:

我经常会遇到某些原因导致操作失败,例如当你读取文件内容的时候有可能会因为文件不在,或者没有权限,或者读取格式不正确,而导致读取失败,这时候我们就需要通过错误处理操作来处理这些问题。

在oc中NSFileManager的错误处理方法是这样写的:
- (BOOL)removeItemAtURL:(NSURL *)URL 
 error:(NSError **)error; ```
#####而在swift中它是转换成了这样:

func removeItemAtURL(URL: NSURL) throws```

Do-Catch结构的错误处理:

do-catch结构如下:
do {
        try expression
        statements
    } catch  pattern 1 {
        statements
    } catch  pattern 2  where condition {
        statements
    }```
####Swift怎么转换oc中的错误处理(Catching and Handling an Error):
初始化一个fileManager 实例然后通告实例移动文件的路径,如果失败了就打印error.domain。
#####这是在oc中的写法

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *fromURL = [NSURL fileURLWithPath:@"/path/to/old"];
NSURL *toURL = [NSURL fileURLWithPath:@"/path/to/new"];
NSError *error = nil;
BOOL success = [fileManager moveItemAtURL:URL toURL:toURL error:&error];
if (!success) {
NSLog(@"Error: %@", error.domain); //如果失败执行这里
} ```

这是在swift中的写法
 let fileManager = NSFileManager.defaultManager()
 let fromURL = NSURL(fileURLWithPath: "/path/to/old")
 let toURL = NSURL(fileURLWithPath: "/path/to/new")
 do {
         try fileManager.moveItemAtURL(fromURL, toURL: toURL)
       } catch let error as NSError {
            print("Error: \(error.domain)")//如果失败执行这里
 }```
#####另外你还可以通过匹配错误代码来找出产生错误的原因

do {
try fileManager.moveItemAtURL(fromURL, toURL: toURL)
} catch NSCocoaError.FileNoSuchFileError {
print("Error: no such file exists")//如果文件不存在执行这里
} catch NSCocoaError.FileReadUnsupportedSchemeError {
print("Error: unsupported scheme (should be 'file://')")//如果没有权限执行这里
}```

把oc中错误转换成可选值,oc中通过检查error的值是否为nil
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSURL *tmpURL = [fileManager URLForDirectory:NSCachesDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL]; 
if (tmpURL != nil) { //判断是否为nil
     // ... 
 } ```
#####在swift中是这样写的,通过try?关键字替换判断error是否为nil

let fileManager = NSFileManager.defaultManager()
if let tmpURL = try? fileManager.URLForDirectory(.CachesDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) {
// ...
}```

下面两种表达方式会有相同的操作
func someThrowingFunction() throws -> Int {
     // ...
}
let x = try? someThrowingFunction()
//下面的代码与上面有相同的意义
let y: Int?
do {
     y = try someThrowingFunction()
      } catch {
     y = nil
}```

#####在oc中抛出一个错误这样写:通告error指针指向那个方法。

// an error occurred
if (errorPtr) {
*errorPtr = [NSError errorWithDomain:NSURLErrorDomain
code:NSURLErrorCannotOpenFile
userInfo:nil];
} ```

在Swift中抛出一个错误这样写:抛出一个error传给调用者。
// an error occurred
 throw NSError(domain: NSURLErrorDomain, code: NSURLErrorCannotOpenFile, userInfo: nil)```
####defer 关键字:
defer 是用于确保所在域结束的时候最后执行的代码操作,代码里面块不能包含有break和return以及扔出一个错误这样的语句。defer 关键字包含的代码块是最后执行的。

func processFile(filename: String) throws {
if exists(filename) {
let file = open(filename)
defer {
close(file)
}
while let line = try file.readline() {
// Work with the file.
}
// close(file) is called here, at the end of the scope.//在这里执行close(file)操作
}
}```

你可能感兴趣的:(错误处理(Error Handling))