错误处理的概念:
我经常会遇到某些原因导致操作失败,例如当你读取文件内容的时候有可能会因为文件不在,或者没有权限,或者读取格式不正确,而导致读取失败,这时候我们就需要通过错误处理操作来处理这些问题。
在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)操作
}
}```
网友评论