C # .net Core ловить пользовательские исключения - PullRequest
0 голосов
/ 25 июня 2018

Где моя вина?

У меня есть тип класса 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() is ApiException).

Как отловить мое исключение?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

- отредактируйте, увидев еще более реальный код:

  • Если ваш абонент не асинхронный, будьте осторожны, потому что это может привести к взаимоблокировке:
// Type = ValidateToken(token).Result;
   Type = ValidateToken(token).GetAwaiter().GetResult();
  • когда вызывающий метод также асинхронный:
Type = await ValidateToken(token); 

Оба из них "развернут" совокупное исключение.
Ваше пользовательское исключение, конечно, является одним из исключений InnerException этой AggregateException.

0 голосов
/ 25 июня 2018

Ваша ApiException не будет должным образом поймана, если вы не await ValidateToken() позвоните. Когда вы используете:

Type = ValidateToken(token)Result;

вместо:

Type = await ValidateToken(token);

Ваши исключения будут заключены в AggregateException.

Правильное использование await позволит поймать правильное исключение.

Используйте это:

try {
  Type = await ValidateToken(token);
} catch (ApiException ae) {
  Console.WriteLine(ae.Message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...