C#.net Core捕获自定义异常

时间:2018-06-25 13:07:29

标签: c# exception .net-core

我的错在哪里?

我的课程类型为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>

如何捕获我的异常?

2 个答案:

答案 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);
}