我已经搜索了一段时间,没有找到任何东西-甚至没有在这个网站上的问题-所以现在我想知道Swift 2是否像Java一样支持多捕获块。
Java示例:
try {
someMethod(); // throws ExceptionOne, ExceptionTwo
} catch(ExceptionOne | ExceptionTwo e) {
handleMyException();
} catch(Exception e2) {
handleOtherExceptions();
}
在Swift中,我无法实现类似的解决方案。这个question解释了一个很好的方法来处理一个ErrorType
枚举的不同错误,但是我的要求似乎不同,因为我的错误是用来自HTTP响应的消息初始化的。这是我的枚举:
enum HTTPError: ErrorType {
case BAD_REQUEST(message: String)
case UNAUTHORIZED(message: String)
case NOT_FOUND
case INTERNAL_SERVER_ERROR(message: String)
case NOT_IMPLEMENTED(message: String)
static func getErrorForStatusCode(statusCode: Int, message: String? = nil) -> HTTPError {
switch statusCode {
case 400:
return HTTPError.BAD_REQUEST(message: message!)
case 401:
return HTTPError.UNAUTHORIZED(message: message!)
case 404:
return HTTPError.NOT_FOUND
case 500:
return HTTPError.INTERNAL_SERVER_ERROR(message: message!)
case 501:
return HTTPError.NOT_IMPLEMENTED(message: message!)
default:
return HTTPError.INTERNAL_SERVER_ERROR(message: message!)
}
}
}
当我想抛出该枚举的错误时,我使用这样的代码:
func someMethod() throws {
...
HTTPError.getErrorForStatusCode(400, message: "Field X missing") // Actual values coming from HTTP-response
...
}
现在,在调用方法中,我必须分别捕获枚举的每个错误,尽管我希望它们都做同样的事情(除了NOT_FOUND
,但这在这里并不重要):
try {
someMethod() // throws
} catch HTTPError.BAD_REQUEST(let message) {
// display 'message' to user
} catch HTTPError.UNAUTHORIZED(let message) {
// display 'message' to user
} catch HTTPError.INTERNAL_SERVER_ERROR(let message) {
// display 'message' to user
}
...
Swift 2真的不包含多重捕获吗?或者有其他的解决方案可以帮助我解决我的问题吗?
**EDIT:**似乎我想要的行为不是很清楚:我希望以同样的方式处理HTTPError类型的错误(HTTPError.NOT_FOUND除外),这就是为什么我要求使用多重捕获。
我仍然会实现一个通用的catch-block来覆盖我不知道的所有错误(例如超时、nil-access...),但是那些伴随后端消息而来的错误应该被特殊处理。
谢谢你,chuky
3条答案
按热度按时间oxcyiej71#
Swift 2不支持多重捕获
来自文档
您可以在catch之后编写一个模式,以指示该子句可以处理哪些错误。**如果catch子句没有模式,则该子句将匹配任何错误,并将该错误绑定到一个名为
error
**的本地常量。因此,获取
error
常量并使用switch
语句。或使用
catch
模式这也是穷举的,因为所有其它情况都具有消息。
除此之外,您(开发人员)应该确切地知道枚举中的事例数,以便能够可靠地处理它们。
编辑:
另一个解决方案是在
enum
中添加associatedValue
属性并使用以下switch语句
20jt8wwn2#
lbsnaicq3#
Swift 5.3现在支持多模式catch。查看建议详情:https://github.com/apple/swift-evolution/blob/master/proposals/0276-multi-pattern-catch-clauses.md