首页 > 解决方案 > AWS 开发工具包、C#:捕获 GetUserAsync 异常并继续

问题描述

我在 dotnetcore 3.1(C#) 上,并且正在使用 AWS 开发工具包。我有一个测试凭据的功能,我GetUserAsync使用AmazonIdentityManagementServiceClient. 问题是,当我的凭据错误时,会引发异常并停止执行。

public async Task<GetUserResponse> TestCredentials(string accessId, string accessKey)
{
    AWSCredentials awsCredentials = new BasicAWSCredentials(accessId, accessKey);
    AmazonIdentityManagementServiceClient client = new AmazonIdentityManagementServiceClient(awsCredentials);
    var userAsync = client.GetUserAsync();

    try
    {
         await userAsync;
    }
    catch (Exception ex)
    {
        // Log the error here
        var something = 100;
    }

    return userAsync.Result;
}

当使用不正确的登录名时,我仍然想处理一个结果,但是由于执行已经停止(至少在我的测试中),我无法用它做任何事情。如何告诉我的代码捕获异常,并仍然返回userAsync.Result?

以下是我的完整性测试。

[TestMethod()]
public async Task TestBadCredentialsTest()
{
    var awsAccessKeyId = "WRONG";
    var awsSecretAccessKey = "EVENWORSE";

    AWSCredentialsService awsCredentialsService = new AWSCredentialsService();
    var getUserResponse = await awsCredentialsService.TestCredentials(awsAccessKeyId, awsSecretAccessKey);


    // Test never gets to here
    var httpStatus = getUserResponse.HttpStatusCode;
    Assert.AreNotEqual(HttpStatusCode.OK, httpStatus);
}

任何帮助是极大的赞赏。

标签: c#aws-sdkamazon-iam

解决方案


任务可能会以异常结果完成。它永远不可能两者兼得。

不同的 HTTP 客户端库具有不同的功能——我对 AWS 并不熟悉——但它们中的许多都有一种可以抛出的“详细异常”类型。如果您捕获了特定的异常类型,那么您可以获得异常详细信息,有时甚至可以获得整个 HTTP 响应本身。但是,您可用的类型和方法都取决于客户端库。


推荐阅读