Swift 2 - 尝试多次捕获
Swift 2 - try multi-catch
我搜索了一下,没有找到任何东西 - 甚至在这个网站上都没有问题 - 所以现在我想知道 Swift 2 是否像 Java 那样支持多捕获块.
Java-示例:
try {
someMethod(); // throws ExceptionOne, ExceptionTwo
} catch(ExceptionOne | ExceptionTwo e) {
handleMyException();
} catch(Exception e2) {
handleOtherExceptions();
}
在 Swift 中,我无法实施类似的解决方案。 解释了一种处理一个 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
}
...
Swift2真的不包含multi-catch吗?或者是否有其他解决方案可以帮助我解决问题?
编辑: 看来我想要的行为不太清楚:我想以同样的方式处理 HTTPError 类型的错误(HTTPError.NOT_FOUND 除外),这就是为什么我要求多次捕获。
我仍然会实现一个通用的 catch-block 来覆盖我不知道的所有错误(例如超时、nil-access 等),但是那些伴随后端消息而来的错误应该被处理特别地
谢谢,
矮胖的
enum Error: ErrorType {
case E1
case E2
case E3
}
func foo(e: Error) throws {
throw e
}
do {
try foo(Error.E2)
} catch Error.E1 {
print(Error.E1) // only Error.E1
} catch {
print("error: ", error) // all other errors
}
/*
error: E2
*/
Swift 2确实支持multi-catch
来自文档
You write a pattern after catch to indicate what errors that clause
can handle. If a catch clause doesn’t have a pattern, the clause
matches any error and binds the error to a local constant named error
.
所以获取 error
常量并使用 switch
语句。
do {
try someMethod() // throws
} catch let error as HTTPError {
switch error {
case .NOT_FOUND:
print("not found")
case let message: // handle all errors with a message
print(message)
}
}
或使用 catch
模式
do {
try someMethod() // throws
} catch HTTPError.NOT_FOUND {
print("not found")
} catch let message {
print(message)
}
这也是详尽无遗的,因为所有其他案例都有一条消息。
除此之外,您(开发人员)应该确切知道枚举中的案例数量,以便您可以可靠地处理它们。
编辑:
另一种解决方法是在enum
里面加一个associatedValue
属性
var associatedValue : String {
switch self {
case BAD_REQUEST(let value) : return value
case UNAUTHORIZED(let value) : return value
case INTERNAL_SERVER_ERROR(let value) : return value
case NOT_IMPLEMENTED(let value) : return value
default: return ""
}
}
并使用此 switch 语句
do {
try someMethod() // throws
} catch HTTPError.NOT_FOUND {
print("not found")
} catch let error as HTTPError {
print(error.associatedValue)
}
multi-pattern 捕获现在在 Swift 5.3 中得到支持
查看提案详情:
https://github.com/apple/swift-evolution/blob/master/proposals/0276-multi-pattern-catch-clauses.md
我搜索了一下,没有找到任何东西 - 甚至在这个网站上都没有问题 - 所以现在我想知道 Swift 2 是否像 Java 那样支持多捕获块.
Java-示例:
try {
someMethod(); // throws ExceptionOne, ExceptionTwo
} catch(ExceptionOne | ExceptionTwo e) {
handleMyException();
} catch(Exception e2) {
handleOtherExceptions();
}
在 Swift 中,我无法实施类似的解决方案。 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
}
...
Swift2真的不包含multi-catch吗?或者是否有其他解决方案可以帮助我解决问题?
编辑: 看来我想要的行为不太清楚:我想以同样的方式处理 HTTPError 类型的错误(HTTPError.NOT_FOUND 除外),这就是为什么我要求多次捕获。
我仍然会实现一个通用的 catch-block 来覆盖我不知道的所有错误(例如超时、nil-access 等),但是那些伴随后端消息而来的错误应该被处理特别地
谢谢, 矮胖的
enum Error: ErrorType {
case E1
case E2
case E3
}
func foo(e: Error) throws {
throw e
}
do {
try foo(Error.E2)
} catch Error.E1 {
print(Error.E1) // only Error.E1
} catch {
print("error: ", error) // all other errors
}
/*
error: E2
*/
Swift 2确实支持multi-catch
来自文档
You write a pattern after catch to indicate what errors that clause can handle. If a catch clause doesn’t have a pattern, the clause matches any error and binds the error to a local constant named
error
.
所以获取 error
常量并使用 switch
语句。
do {
try someMethod() // throws
} catch let error as HTTPError {
switch error {
case .NOT_FOUND:
print("not found")
case let message: // handle all errors with a message
print(message)
}
}
或使用 catch
模式
do {
try someMethod() // throws
} catch HTTPError.NOT_FOUND {
print("not found")
} catch let message {
print(message)
}
这也是详尽无遗的,因为所有其他案例都有一条消息。
除此之外,您(开发人员)应该确切知道枚举中的案例数量,以便您可以可靠地处理它们。
编辑:
另一种解决方法是在enum
associatedValue
属性
var associatedValue : String {
switch self {
case BAD_REQUEST(let value) : return value
case UNAUTHORIZED(let value) : return value
case INTERNAL_SERVER_ERROR(let value) : return value
case NOT_IMPLEMENTED(let value) : return value
default: return ""
}
}
并使用此 switch 语句
do {
try someMethod() // throws
} catch HTTPError.NOT_FOUND {
print("not found")
} catch let error as HTTPError {
print(error.associatedValue)
}
multi-pattern 捕获现在在 Swift 5.3 中得到支持 查看提案详情: https://github.com/apple/swift-evolution/blob/master/proposals/0276-multi-pattern-catch-clauses.md