【问题标题】:How to handle error in Dropbox C# SDK?如何处理 Dropbox C# SDK 中的错误?
【发布时间】:2017-04-27 15:13:54
【问题描述】:

属性如何处理 Dropbox C# SDK 中的错误?

我想使用通用方法来处理来自不同 API 调用的错误。此方法应在顶级应用程序级别和 serevals API 调用中使用。对于大多数云 API(如 Microsoft OneDrive 和 Google Drive API)我可以这样做,因为有严格定义的列表(枚举将所有错误代码)并且只有一个异常类用于错误处理。 但在 Dropbox C# SDK 中,一切都相反!没有任何错误代码列表,但有十几个异常类(一个异常模板Dropbox.Api.ApiException<T>T 模板参数的大量错误对象)。查找文件操作的错误类计数示例 - http://dropbox.github.io/dropbox-sdk-dotnet/html/N_Dropbox_Api_Files.htm

什么鬼!如何处理所有这些?写巨人catch()块?

更糟糕的是,它们中的大多数使用相同的错误类型!
例如,描述“未找到”、“格式错误的路径”等错误的类 Dropbox.Api.Files.LookupError21 的一部分!其他错误类。为了处理简单的“未找到”错误,我必须能够捕获两打异常!正常吗?

那么,Dropbox C# SDK 中的属性如何处理错误?

【问题讨论】:

  • 这取决于您是否希望您的应用程序在每种情况下执行不同的操作。如果没有,您可以只处理顶级异常类型,并记录/报告特定错误以供稍后调试/解决。如果您需要您的客户端应用程序在特定情况下表现不同(除了显示不同的错误),那么是的,您必须专门处理这种情况。这个明确记录的可能异常列表与其他 SDK 中提供的枚举有何不同?在这两种情况下,您都有可能出现的错误的有限列表。
  • @ADyson,我希望我的应用程序必须显示来自应用程序资源的用户友好错误消息(取决于用户选择的本地化)。所以我需要仔细处理异常并显示正确的消息(不是调试器消息或异常堆栈)!怎么做?抓住所有!?请问,“明确记录”在哪里?能给个链接吗?
  • 那么您不将dropbox.github.io/dropbox-sdk-dotnet/html/… 的链接视为错误文档吗?似乎都列出来了。顺便说一句,你真的尝试过吗?异常可能会为您提供足够友好的错误消息,您可以报告这些错误消息。如果没有,您可以自己准备并将它们映射到 Dropbox 错误。你会得到一些 DropboxException 的孩子,它会包含一条消息。也许他们会与你指出的那些错误属性有对应关​​系。
  • @ADyson,是的,但那些链接不是“文档”。它只是类列表的简要描述,此外还有其他错误类:共享和用户方法。异常如何给我友好的错误信息?异常消息是否已翻译为我所需的所有语言,我如何通过语言代码接收消息:(“de-DE”、“en-US”、“fr-FR”等)?将我的消息映射到 Dropbox 错误是一个有趣的想法。你能举个粗鲁的例子吗?

标签: c# dropbox dropbox-api


【解决方案1】:

如果您想捕获任意 Dropbox 异常,而不是处理特定异常,您可以捕获父类型 DropboxException,如下所示:

try {
    var account = await this.client.Users.GetCurrentAccountAsync();
    // use account
} catch (DropboxException ex) {
    // inspect and handle ex as desired
}

try {
    var list = await client.Files.ListFolderAsync(string.Empty);
    // use list
} catch (DropboxException ex) {
    // inspect and handle ex as desired
}


try {
    var download = await client.Files.DownloadAsync(path);
    // use download
} catch (DropboxException ex) {
    // inspect and handle ex as desired
}

这是一个更完整的示例,展示了如何捕获特定异常,以及如何检查一般捕获的异常:

try {
    var list = await client.Files.ListFolderAsync(string.Empty);
    // use list
} catch (ApiException<Dropbox.Api.Files.ListFolderError> ex) {
    // handle ListFolder-specific error
} catch (DropboxException ex) {
    // inspect and handle ex as desired
    if (ex is AuthException) {
        // handle AuthException, which can happen on any call
        if (((AuthException)ex).ErrorResponse.IsInvalidAccessToken) {
            // handle invalid access token case
        }
    } else if (ex is HttpException) {
        // handle HttpException, which can happen on any call
    }
}

【讨论】:

  • 谢谢。你能告诉我一些细节吗?例如,我有执行文件夹扫描的方法(如lsdir 命令行)。该方法调用Dropbox.Api.Files.ListFolder???Async..Files.GetMetadataAsync..Sharing.ListFolder???Async...Sharing.ListFile???Async...Users.GetAccount???Async。现在出现了异常。如何从 DropboxException 定义其原因?或者我应该始终将其转换为ApiException&lt;T&gt;,其中 T 是...Files.GetMetadataError...Files.ListFolderError...Files.ListFolderContinueError...Users.GetAccountError 等之一。
  • 如果您查看方法定义,例如dropbox.github.io/dropbox-sdk-dotnet/html/… 它向您展示了该方法可以引发哪些异常。在此示例中,它显示“如果处理请求时出错,则抛出 ApiException;这将包含 ListFolderError。”因此,对于每个错误陷阱,您只需要考虑实际上可能从您调用的方法中抛出的错误。
  • @ADyson 是的,这是我应该捕获的一大串异常。因为我使用了很多函数:) 我认为枚举的一个例外会更好。
  • 但对于每种方法,列表并没有那么大。并且您可以编写处理每种异常类型的小子例程,然后如果不同的方法可以抛出相同的异常,则可以重新使用它们。是的,还有工作要做,但是如果有一个枚举,你仍然需要一个大量的 switch 声明或其他东西来决定在每种情况下做什么。当然,如果您不喜欢提供的 SDK,您可以随时针对 HTTP API 编写自己的 :-)
  • 处理特定错误(例如,特定于任何特定调用)可能是一种更好的做法,但您的应用程序中错误处理的特异性取决于您。我更新了我的答案,以展示更多不同数量的错误处理示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
相关资源
最近更新 更多