3.10
Error Handling
假設(shè)某個函數(shù)myFunction需要去返回一個String類型撬陵,不過有可能會在某個點拋出異常,一般來說會將該函數(shù)的返回值設(shè)置為String?:
Example:
func?readFile(withFilename?filename:?String)?->?String??{
guard?let?file?=?openFile(filename)else{
return nil
}
let?fileContents?=?file.read()
file.close()
return fileContents
}
func?printSomeFile()?{
let?filename?=?"somefile.txt"
guard?let?fileContents?=?readFile(filename)else{
print("Unable?to?open?file?\(filename).")
return
}
print(fileContents)
}
不過作為異常處理的角度溢十,我們應該使用Swift的try-catch表達式,這樣能顯式地知道錯誤點:
struct?Error:?ErrorType?{
public?let?file:?StaticString
public?let function:?StaticString
public?let?line:?UInt
public?let?message:?String
public?init(message:?String,?file:?StaticString?=?#file,?function:?StaticString?=?#function,?line:?UInt?=?#line)?{
self.file?=?file
self.function=function
self.line?=?line
self.message?=?message
}
}
Example usage:
func?readFile(withFilename?filename:?String)?throws?->?String?{
guard?let?file?=?openFile(filename)else{
throwError(message:?"Unable?to?open?file?named?\(filename).")
}
let?fileContents?=?file.read()
file.close()
return fileContents
}
func?printSomeFile()?{
do{
let?fileContents?=tryreadFile(filename)
print(fileContents)
}catch{
print(error)
}
}
總而言之达吞,如果某個函數(shù)可能會出錯张弛,并且出錯的原因不能顯式地觀測到,那么應該優(yōu)先拋出異常而不是使用一個Optional作為返回值酪劫。