我的课程类型为Exception
public class ApiException : Exception {
public ApiException(string message) : base(message) {
}
}
在某些情况下,我致电throw new ApiException("Message");
例如此处:
public static async Task<string> ValidateToken(string token) {
Dictionary<string, string> values = new Dictionary<string, string> {
{ "token", token}
};
FormUrlEncodedContent content = new FormUrlEncodedContent(values);
HttpResponseMessage response = await client.PostAsync(Globals.sso, content);
string responseString = await response.Content.ReadAsStringAsync();
if (response.IsSuccessStatusCode) {
TokenResp result = JsonConvert.DeserializeObject<TokenResp>(responseString);
if (result.Token != token)
throw new ApiException("Token is invalid");
} else {
NonFieldResponse resp = JsonConvert.DeserializeObject<NonFieldResponse>(responseString);
string msg = null;
foreach (string message in resp.non_field_errors) {
if (msg != null) msg += ", ";
msg += message;
}
throw new ApiException(msg);
}
在某个地方,我需要catch
这样的例外情况:
try {
Type = ValidateToken(token).Result;
} catch (ApiException ae) {
Console.WriteLine(ae.Message);
} catch (Exception e) {
Console.WriteLine(e.Message);
}
但是catch (ApiException ae)
不会发生,总是捕获简单的Exception
(其中e.GetType()
是AggregateException
,而e.InnerException.GetType()
是ApiException
)。 / p>
如何捕获我的异常?
答案 0 :(得分:3)
-在看到更真实的代码后进行编辑:
// Type = ValidateToken(token).Result;
Type = ValidateToken(token).GetAwaiter().GetResult();
Type = await ValidateToken(token);
这两个方法都会“解开”聚合异常。
您的自定义异常当然是该AggregateException的InnerException之一。
答案 1 :(得分:2)
除非您await
进行ValidateToken()
调用,否则您将无法正确捕获ApiException。使用时:
Type = ValidateToken(token)Result;
代替:
Type = await ValidateToken(token);
您的异常将包含在AggregateException
中。
正确使用await
可以捕获适当的异常。
使用此:
try {
Type = await ValidateToken(token);
} catch (ApiException ae) {
Console.WriteLine(ae.Message);
}