来自Android,在try..catch语句中包装一段代码非常简单。
try{
//A whole lot of code
} catch (Exception e) {
//Exception is a parameter
}
我想在Swift中做同样的事情,但它似乎并不那么容易。 如果我理解正确,你需要尝试一些你认为会出错的事情。
是否有类似于Android的功能 - 我在Swift工具箱中描述的功能?
答案 0 :(得分:0)
我每天面对swift的一个非常典型的例子是在收到服务器的响应之后将NSData转换为JSON对象作为Dictionary
let dataTask = session.dataTaskWithRequest(request, completionHandler:
{ (data, response, error) -> Void in
if error != nil {
print("Error: \(error)")
// Fetch error
}
// note that code till here wasnt important, I added it to
// just give you an idea of the flow
// 这是实际的try / catch块(而不是/ catch)块开始的地方
do {
var dictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as! NSDictionary
}
catch let jsonError as NSError
{
print("json error: \(jsonError.localizedDescription)")
}
}
还有其他一百万个例子,我选择了这个例子,因为我每天都使用这个例子
答案 1 :(得分:0)
Swift 2中的错误处理需要考虑两件事:
throws
关键字)。对于非投掷方法,这很简单:您不需要添加任何try
或do/catch
。
抛出的方法必须始终以try
为前缀,而不考虑范围。所以,这是你问题答案的一部分。
如果范围正在抛出,您不必使用do/catch
(但您可以)。在这种情况下,当前作用域中抛出的所有未被它处理的错误将被传递到上游到父投掷范围。
如果范围是非抛出的,那么您必须处理从所述范围调用的方法可能抛出的所有错误。因此,您必须使用do/catch
。
根据您的具体情况,您可能还必须放置do/catch
。如果您当前的范围是非投掷,则必须这样做。
do/catch
有3种类型。
<强>予。抓住所有
do {
methodThadDoesNotThrow()
try methodThatThrows()
}
catch {
// This will catch all errors that can be possibly thrown.
// You get implicit local-scope variable `error` that holds thrown error.
}
<强> II。抓住具体的错误类型
可抛出的错误必须实现ErrorType
协议。这是唯一的先决条件。它们实际上不一定是NSError
或它的后代(这种类型只是来自Objective-C
的遗产)。因此,如果您知道您期望的具体错误类型,则可以执行以下操作:
do {
methodThadDoesNotThrow()
try methodThatThrows()
}
catch let error as CustomErrorType {
// This will catch all `CustomErrorType` errors.
// You get explicit local-scope variable `error` of `CustomErrorType` type.
}
<强> III。抓住具体的错误实例
通常,错误类型声明为enum
s。例如:
enum CustomErrorType {
case SomethingStrange(String)
case SomethingMildlyHorrible
case Apocalypse
}
如果你想抓住CustomErrorType
的某些特定情况,你可以这样做:
do {
methodThadDoesNotThrow()
try methodThatThrows()
}
catch CustomErrorType.SomethingStrange(let message) {
// This will catch only `CustomErrorType.SomethingStrange` errors.
// You get explicit local-scope variable `message` that
// will come from the value associated with the error enum-case.
}
当然有以下情况:
<强> IV。全部合并
do {
methodThadDoesNotThrow()
try methodThatThrows()
}
catch CustomErrorType.SomethingStrange(let message) {
// This will catch `CustomErrorType.SomethingStrange` error.
}
catch let error as CustomErrorType {
// This will catch the rest of `CustomErrorType` errors.
}
catch {
// Finally, this will catch all the rest of the errors
// (anything that is not `CustomErrorType` in this case).
}