如何获取函数抛出的错误列表?
How get the list of errors thrown by a function?
使用 Swift 现在一些函数标有 throws
,这迫使开发人员在 do - try catch
块中调用函数。
但是开发人员如何知道该函数抛出的不同异常列表?
作为参考,这里有一行 Java 代码:
static void employeeAge(int age) throws MyExceptionA,MyExceptionB
此处很明显,异常是 2 MyExceptionA
和 MyExceptionB
,开发人员可以根据错误决定采取不同的行动。
我们可以在 Swift 上实现同样的目标吗?
您在 catch 之后写一个模式来指示该子句可以处理的错误。
do {
try expression
statements
} catch pattern 1 {
statements
} catch pattern 2 where condition {
statements
}
的使用 Do-Catch 处理错误部分
当 Swift 文档说一个函数 throws
时,它们的意思是它抛出一个 ErrorType
(在 Cocoa API 中通常是一个 NSError
),也不例外。
考虑 NSFileManager
的 createDirectoryAtPath
的以下 do-try-catch
流程:
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
do {
try NSFileManager.defaultManager().createDirectoryAtPath(documentsPath, withIntermediateDirectories: false, attributes: nil)
} catch {
// 'error' variable automatically populated
print(error)
print(error.dynamicType)
}
createDirectoryAtPath
将失败,因为文档目录已经存在。记录 error
的 dynamicType
表明它实际上是一个 NSError
对象:
Error Domain=NSCocoaErrorDomain Code=516 "The file “Documents” couldn’t be saved in the folder “35B0B3BF-D502-4BA0-A991-D07568AB87C6” because a file with the same name already exists." UserInfo={NSFilePath=/Users/jal/Library/Developer/CoreSimulator/Devices/E8A35774-C9B7-42F0-93F1-8103FBBC7118/data/Containers/Data/Application/35B0B3BF-D502-4BA0-A991-D07568AB87C6/Documents, NSUnderlyingError=0x7fa88bd14410 {Error Domain=NSPOSIXErrorDomain Code=17 "File exists"}}
NSError
为了查看函数可以 throw
的不同类型的错误,您必须检查 error
的信息以确定抛出的错误类型,以及如何处理每个错误.在 NSError
的情况下,这将是它的域、代码和描述。
在这种特殊情况下,目录已存在于该路径中,因此文件管理器无法创建新目录。此操作可能失败的另一个原因示例是文件管理器没有写入权限。那将是错误代码 256。
我有与 OP 完全相同的问题。由于没有人真正回答他提出的问题(我也是),这里是我的贡献。
在Swift 3 和Xcode 8.3.3 中,您可以按如下方式处理个别异常。下面我给大家举个FileManager的例子。
首先,您将只有一个 catch 块来捕获该方法向您抛出的任何错误。然后你将该错误转换为 NSError。与 Swift 中的错误协议相反,NSError 是一个真正的错误 class。然后您可以在 switch 语句中提取该错误的代码。您必须知道该方法从哪个域抛出错误,然后在相应的头文件中找到错误代码。
在我下面的示例中,文件相关错误在 NSCocoaErrorDomain 中抛出,这些错误代码在 Foundation/FoundationErrors.h 中为 defined/listed。在我的电脑中,它们位于
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/FoundationErrors.h
对于 macOS 应用程序和
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/
iPhone 个应用。
所以这是一个例子:
let home = FileManager.default.homeDirectoryForCurrentUser
let file = home.appendingPathComponent("file")
do {
let loadedString = try String(contentsOf: file)
}
catch {
let realError = error as NSError // As weird as it looks, Xcode actually wants this forced conversion
print(realError.localizedDescription)
switch realError.code {
case 257: // No permission
handleNoPermission()
case 260: // File not found
handleFileNotFound()
default:
handleUndefinedError()
}
}
.localizedDescription
包含关于该错误的用户友好消息,使用您的用户的语言。如果在上面找不到文件,它会用英文打印:The file “file” couldn’t be opened because there is no such file.
。它旨在直接在您呈现给用户的错误对话框中使用。
您还可以在此处找到有关每个域抛出的错误的更多信息:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
使用 Swift 现在一些函数标有 throws
,这迫使开发人员在 do - try catch
块中调用函数。
但是开发人员如何知道该函数抛出的不同异常列表?
作为参考,这里有一行 Java 代码:
static void employeeAge(int age) throws MyExceptionA,MyExceptionB
此处很明显,异常是 2 MyExceptionA
和 MyExceptionB
,开发人员可以根据错误决定采取不同的行动。
我们可以在 Swift 上实现同样的目标吗?
您在 catch 之后写一个模式来指示该子句可以处理的错误。
do {
try expression
statements
} catch pattern 1 {
statements
} catch pattern 2 where condition {
statements
}
的使用 Do-Catch 处理错误部分
当 Swift 文档说一个函数 throws
时,它们的意思是它抛出一个 ErrorType
(在 Cocoa API 中通常是一个 NSError
),也不例外。
考虑 NSFileManager
的 createDirectoryAtPath
的以下 do-try-catch
流程:
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
do {
try NSFileManager.defaultManager().createDirectoryAtPath(documentsPath, withIntermediateDirectories: false, attributes: nil)
} catch {
// 'error' variable automatically populated
print(error)
print(error.dynamicType)
}
createDirectoryAtPath
将失败,因为文档目录已经存在。记录 error
的 dynamicType
表明它实际上是一个 NSError
对象:
Error Domain=NSCocoaErrorDomain Code=516 "The file “Documents” couldn’t be saved in the folder “35B0B3BF-D502-4BA0-A991-D07568AB87C6” because a file with the same name already exists." UserInfo={NSFilePath=/Users/jal/Library/Developer/CoreSimulator/Devices/E8A35774-C9B7-42F0-93F1-8103FBBC7118/data/Containers/Data/Application/35B0B3BF-D502-4BA0-A991-D07568AB87C6/Documents, NSUnderlyingError=0x7fa88bd14410 {Error Domain=NSPOSIXErrorDomain Code=17 "File exists"}} NSError
为了查看函数可以 throw
的不同类型的错误,您必须检查 error
的信息以确定抛出的错误类型,以及如何处理每个错误.在 NSError
的情况下,这将是它的域、代码和描述。
在这种特殊情况下,目录已存在于该路径中,因此文件管理器无法创建新目录。此操作可能失败的另一个原因示例是文件管理器没有写入权限。那将是错误代码 256。
我有与 OP 完全相同的问题。由于没有人真正回答他提出的问题(我也是),这里是我的贡献。
在Swift 3 和Xcode 8.3.3 中,您可以按如下方式处理个别异常。下面我给大家举个FileManager的例子。
首先,您将只有一个 catch 块来捕获该方法向您抛出的任何错误。然后你将该错误转换为 NSError。与 Swift 中的错误协议相反,NSError 是一个真正的错误 class。然后您可以在 switch 语句中提取该错误的代码。您必须知道该方法从哪个域抛出错误,然后在相应的头文件中找到错误代码。
在我下面的示例中,文件相关错误在 NSCocoaErrorDomain 中抛出,这些错误代码在 Foundation/FoundationErrors.h 中为 defined/listed。在我的电脑中,它们位于
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/FoundationErrors.h
对于 macOS 应用程序和
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/
iPhone 个应用。
所以这是一个例子:
let home = FileManager.default.homeDirectoryForCurrentUser
let file = home.appendingPathComponent("file")
do {
let loadedString = try String(contentsOf: file)
}
catch {
let realError = error as NSError // As weird as it looks, Xcode actually wants this forced conversion
print(realError.localizedDescription)
switch realError.code {
case 257: // No permission
handleNoPermission()
case 260: // File not found
handleFileNotFound()
default:
handleUndefinedError()
}
}
.localizedDescription
包含关于该错误的用户友好消息,使用您的用户的语言。如果在上面找不到文件,它会用英文打印:The file “file” couldn’t be opened because there is no such file.
。它旨在直接在您呈现给用户的错误对话框中使用。
您还可以在此处找到有关每个域抛出的错误的更多信息:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html