2015-09-16 5 views
0

Я разработать универсальное приложение, что нужно несколько пользовательских исключений, чтобы поймать ошибки, возникающие при вызове WebServices: NoInternetAccessException, NoJSONException, UserTimeoutException, ...Пользовательские исключения и сообщения Dialog в предложении Try-Catch

Вот пример один из этих классов:

public class NoInternetAccessException : Exception 
    { 
     private DateTime time; 

     public DateTime Time { get { return time; } } 

     public NoInternetAccessException(string message, DateTime time) 
      : base(message) 
     { 
      this.time = time; 
     } 
    } 

я поймать эти исключения в нескольких местах:

в JSONParser, где я создаю URI и вызвать метод Client.GetAsync:

... 
    try 
    { 
     CancellationTokenSource cts = new CancellationTokenSource(Timeout); 
     response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead).AsTask(cts.Token); 
     if (response.IsSuccessStatusCode) 
      return response;     
    } 
    catch (TaskCanceledException) 
    { 
     if ((_currentRetries == MaxRetries) 
      throw new UserTimeoutException("User Timeout Exception", DateTime.Now); 
     else 
      _currentRetries++; 
    } 
    catch (Exception e) 
    { 
     if (e.HResult == -2147012889) 
      throw new WrongUrlException("Wrong URL Exception", e, DateTime.Now); 
    } 
    ... 

в помощнике в WebService, где мне удается все WebServices звонки:

public static async Task<Infos> GetInfos(String url, List<KeyValuePair<String, String>> parameters, String protocol) 
    {   
     var response = await JSONParser.getJSONFromUrl(url, parameters, ""); 
     Infos infos = new Infos(); 

     try 
     { 
      WsResponse wsResponse = JsonConvert.DeserializeObject<Infos>(response.ToString()); 
      infosCe = JsonConvert.DeserializeObject<Infos>(wsResponse.data.ToString()); 
      return infosCe; 
     } 
     catch (Exception e) 
     { 
      throw new DeserializeException("Deserialize exception", e, DateTime.Now, "Infos"); 
     } 
    } 

Все эти исключения наконец поймала по ViewModels, после вызова на веб-сервисы:

private async Task<Infos> WebServiceGetInfos() 
    { 
     ... 
     try 
     { 
      Infos infos = await WebServices.GetInfos(url, parameters, ""); 
      return infosCe; 
     } 

     // Exceptions 
     catch (DeserializeException dE) 
     { 
      ExceptionsMsgboxHelper.MsgboxDeserialize(dE); 
      return null; 
     } 
     catch (NoInternetAccessException niaE) 
     { 
      ExceptionsMsgboxHelper.MsgboxNoInternetAccess(niaE, true, ""); 
      return null; 
     } 
     catch (NoJSONException njsonE) 
     { 
      ExceptionsMsgboxHelper.MsgboxNoJSON(njsonE); 
      return null; 
     } 
     ... 
    } 

Я бы как так, что каждое исключение вызывает ExceptionsMsgboxHelper помощник, который показывает конкретное сообщение Dialog за исключением:

public async static void MsgboxNoJSON(NoJSONException njsonE) 
    { 
     Windows.UI.Popups.MessageDialog msgbox = 
     new Windows.UI.Popups.MessageDialog("There is a problem when retrieving data. If the problem persists, please contact your administrator.", 
      "Unexpected data received"); 
     await msgbox.ShowAsync(); 
    } 

=> Но это не работает, так как сообщение Dialog не работает в Try -Catch пункт ...

Я также искать решение на StackOverflow:

Message dialog not showing in catch clause

Try-Catch doesn't show Message Dialog box with await

Но я не вижу, как адаптировать это решение моего случая, как я использую несколько пользовательских исключения:

public static async Task Foo() 
    { 
     Exception e = null; 
     try 
     { 
      //just something to throw an exception 
      int a = 0; 
      int n = 1/a; 
     } 
     catch (Exception ex) 
     { 
      e = ex; 
     } 
     if (e != null) 
      await ShowDialog(); 
    } 

=> Является ли это лучший способ сделать это, чем дубликат этот код для каждого настраиваемого исключения?

... 
    DeserializeException dEx = null; 
    NoInternetAccessException niaEx = null; 
    NoJSONException njsonEx = null; 
    try 
    { 
     Infos infos = await WebServices.GetInfos(url, parameters, ""); 
     return infosCe; 
    } 

    // Exceptions 
    catch (DeserializeException dE) 
    { 
     dEx = de; 
    } 
    catch (NoInternetAccessException niaE) 
    { 
     niaEx = niaE; 
    } 
    catch (NoJSONException njsonE) 
    { 
     njsonEx=njsonE; 
    } 
    ... 
    if (dEx != null) 
    { 
     ExceptionsMsgboxHelper.MsgboxDeserialize(dEx); 
     return null; 
    } 
    if (niaEx != null) 
    { 
     ExceptionsMsgboxHelper.MsgboxNoInternetAccess(niaEx); 
     return null; 
    } 
    if (njsonEx != null) 
    { 
     ExceptionsMsgboxHelper.MsgboxNoJSON(njsonEx); 
     return null; 
    } 
    ... 

=> Это, кажется, не быть мощным или ремонтопригодны ...

ответ

0

я, наконец, решить мою проблему, ловя родовое исключение и тестирования:

... 
    Exception ex = null; 
    try 
    { 
     Infos infos = await WebServices.GetInfos(url, parameters, ""); 
     return infosCe; 
    } 

    // Exceptions 
    catch (Exception e) 
    { 
     ex = e; 
    } 
    if (ex != null) 
    { 
     if (ex is DeserializeException) 
     { 
      DeserializeException dE = (DeserializeException)ex; 
      ExceptionsMsgboxHelper.MsgboxDeserialize(dE); 
     } 
     if (ex is NoInternetAccessException) 
     { 
      NoInternetAccessException niaE = (NoInternetAccessException)ex; 
      ExceptionsMsgboxHelper.MsgboxNoInternetAccess(niaE); 
     } 
     if (ex is NoJSONException) 
     { 
      NoJSONException njsonE = (NoJSONException)ex; 
      ExceptionsMsgboxHelper.MsgboxNoJSON(njsonE); 
     } 
     ... 
    } 
    return null; 

=> Если вы считаете, что есть лучший способ сделать это, пожалуйста, укажите мне.