0

我在 try/catch-rethrow 代码块中看到了一些奇怪的行为。

我有一个方法可以实例化一个 ClientGet 类并从该类中获取 Result 值。

public Task<T> Get<T>(ClientRequest<T> Request)
    {
        try
        {
            return new ClientGet<T>(UpdateRequest(Request)).Result;
        }
        catch (Exception)
        {
            throw;
        }
    }

ClientGet 类如下所示:

public class ClientGet<T> : IClientAction<T>
{
    public Task<T> Result { get; set; }

    public ClientGet(ClientRequest<T> request)
    {
        try
        {
            Result = GetResult(request);
        }
        catch (Exception)
        {
            throw;
        }
    }

    private async Task<T> GetResult(ClientRequest<T> request)
    {
        if (string.IsNullOrEmpty(request.FullPath))
        {
            throw new ApplicationException("You must specify a path in your request.");
        }
        try
        {
            using (HttpClient client = new HttpClient())
            {
                if (!string.IsNullOrEmpty(request.Settings.Token)) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", request.Settings.Token); }

                var response = await client.GetAsync(request.FullPath);
                if (response.IsSuccessStatusCode)
                {
                    return JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync());
                }
                throw new HttpRequestException((int)response.StatusCode + ": " + response.ReasonPhrase);
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
}

如果 response.IsSuccessStatusCode 为 false,由于某种原因,代码在我的 GetResult 方法的捕获处停止,并将其作为 ASP.NET Unhandled Exception 错误发布在我的 throw 上;线。我有所有的重新抛出,以便可以将错误传递回应用程序更高级别的原始调用者。

这是我得到的确切信息:

401: Unauthorized 说明:在执行当前的 Web 请求期间发生了未经处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Net.Http.HttpRequestException:401:未经授权

源错误:

Line 45:             catch (Exception)
Line 46:             {
Line 47:                 throw;
Line 48:             }
Line 49:         }
4

1 回答 1

0

不确定你期望发生什么。听起来代码正在做它应该做的事情。如果条件不满足,它会进入新的下一行 throw HttpRequestException,因为这一切都包含在 try-catch 中,该异常被捕获,然后重新抛出。但是,这是第一次允许出现异常,因此 Visual Studio 将在此处指示异常的来源。它最终会被调用方法的 try-catch 捕获,然后在再次抛出后最终提升到未捕获状态。

但是,您在这里违反了使用 try-catch 的基本规则:仅在您打算实际处理异常时才捕获异常。如果你要做的只是把它扔到 catch 块中,那么整个 try-catch 是没有意义的。默认行为是允许它在堆栈中冒泡;你不必明确地抛出它来完成它。

于 2015-11-20T17:29:31.907 回答