Ios 如何获取函数抛出的错误列表?

Ios 如何获取函数抛出的错误列表?,ios,swift,error-handling,nserror,Ios,Swift,Error Handling,Nserror,使用Swift now,一些函数被标记为throws,这迫使开发人员在do-try catch块中调用函数。 但是开发人员如何知道该函数引发的不同异常的列表呢 作为参考,这里有一行Java代码: static void employeeAge(int age) throws MyExceptionA,MyExceptionB 这里很清楚,异常是2MyExceptionA和MyExceptionB,开发人员可以根据错误决定采取不同的行动 我们可以在Swift上实现同样的功能吗?您可以在catc

使用Swift now,一些函数被标记为
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 of

处理错误一节当Swift文档说函数抛出时,它们的意思是它抛出一个
错误类型
(在Cocoa API中通常是一个
n错误
),而不是一个例外

对于
NSFileManager
,请考虑以下
do-try-catch
流程:

createDirectoryAtPath
将失败,因为文档目录已存在。记录
错误的
dynamicType
表明它实际上是一个
NSError
对象:

为了查看函数可以抛出的不同类型的错误,您必须检查
错误
,以获取确定抛出的错误类型以及如何处理每个错误的信息。对于
NSError
而言,这将是它的域、代码和描述


在这种情况下,该路径上已经存在一个目录,因此文件管理器无法创建新目录。此操作失败的另一个原因是文件管理器没有写访问权限。那将是错误代码256。

我的问题与OP完全相同。因为没有人真正回答他问的问题(我也是),所以我的贡献就在这里

在Swift 3和Xcode 8.3.3中,您将按照以下步骤处理个别异常。下面我将给你一个FileManager的例子

首先,您将只有一个catch块来捕获该方法向您抛出的任何错误。然后将该错误转换为N错误。与Swift中的错误协议相反,NSError是一个真正的错误类。然后可以在switch语句中提取该错误的代码。您必须知道该方法从哪个域抛出错误,然后在相应的头文件中查找错误代码

在我下面的示例中,与文件相关的错误被抛出到NSCocoaErrorDomain中,这些错误代码在Foundation/FoundationErrors.h中定义/列出。在我的计算机中,它们位于

/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
包含一条用户友好的消息,用用户的语言表示该错误。如果在上面找不到文件,它将打印:
文件“file”无法打开,因为没有这样的英文文件。
。它将直接用于您呈现给用户的错误对话框中


您还可以在此处找到有关每个域抛出的错误的更多信息:

问题是如何获得函数抛出的所有可能错误的列表。如果我不知道列表,我无法指定我知道如何处理哪些列表。不幸的是,您必须检查dokumentation(API)。注意,除了错误抛出之外,没有异常抛出。如果您正在寻找如何组织代码流的方法,请使用适当的检查。捕捉抛出错误是您从中恢复的最后一次机会,您无法从异常中恢复。这可能是Swift最愚蠢的部分之一,我确实喜欢在其中编程。依靠文档来描述抛出的错误是一回事,但当苹果自己的文档甚至没有列出你应该尝试处理的错误或代码时,这就变成了一个耸肩和猜测的游戏。除了“纯”斯威夫特的错误。。。唯一的要求是抛出错误符合ErrorType protokol。这并不意味着它是一个NSError对象。@user3441734我没有看到Cocoa Touch API或文档中抛出任何“纯”错误,这只是一个使用苹果提供的方法的示例。你能在文件中给我举个“纯”Swift错误的例子吗?此外,无论哪种方式,都不会抛出不同类型的错误。所有错误都属于
NSError
类型或符合
ErrorType
协议。您必须查看错误的具体描述或错误代码,才能找出错误所在。我必须将其转换为NSError,indeedIt似乎域通常属于整个框架。例如,我试图找出核心蓝牙的错误。还有CBATTError和CBError枚举。但是我不能确切地知道
centralManager(:didFailToConnect:error:)
会给出哪个错误,可以吗?不要硬编码错误代码。使用提供的常量。将
257
替换为
NSFileReadNoPermissionError
并将
260
替换为
NSFileReadNoSuchFileError
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/
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()
    }
}