我在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方法的catch处停止,并在我的throw上将其作为ASP.NET Unhandled Exception错误发布;线。我有所有的重新抛出,以便错误可以传递回应用程序的更高级别的原始调用者。
以下是我收到的确切消息:
401:未经授权 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详情:System.Net.Http.HttpRequestException:401:未经授权
来源错误:
Line 45: catch (Exception)
Line 46: {
Line 47: throw;
Line 48: }
Line 49: }
答案 0 :(得分:0)
不确定您预计会发生什么。听起来像代码正在做它应该做的事情。如果条件不满意,它会进入新的下一行,你抛出HttpRequestException
,因为这都包含在try-catch中,该异常被捕获,然后重新抛出。但是,这是第一次允许异常冒泡,因此这是Visual Studio将指示源自异常的位置。它最终将被调用方法的try-catch捕获,然后在它再次被抛出后最终被提升到未被捕获状态。
但是,你在这里打破了使用try-catch的基本规则:如果你打算实际处理它,只能捕获异常。如果你要做的就是把它扔进catch块,那么整个try-catch都是没有意义的。默认行为是允许它在堆栈中冒泡;你不必明确地抛出它来实现它。