美文网首页swift学习笔记
错误处理(Error Handling)

错误处理(Error Handling)

作者: 成功的失败者 | 来源:发表于2016-05-08 10:53 被阅读282次

    错误处理的概念:

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

    在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)

        本文链接:https://www.haomeiwen.com/subject/dlysrttx.html