System.Net.WebException не перехватывается в Windows Phone 8

Я пытаюсь вызвать веб-службу с помощью RestSharp (это необходимо сделать для WP8 и выше).

Это мой триггерный метод:

 private async void postRest()
 {
     string getSyncService = "MyService"; 
     var client = new RestClient(ip);
     var request = new RestRequest(getSyncService, Method.POST);              
     request.RequestFormat = DataFormat.Json;
     JsonObject jsonGenericRequest = new JsonObject();
     jsonGenericRequest.Add("companyid", "123");
     jsonGenericRequest.Add("token", "123");            ...
     request.AddParameter("GenMobileRequest", jsonGenericRequest);
     request.AddHeader("Access-Control-Allow-Methods", "POST");
     request.AddHeader("Content-Type", "application/json; charset=utf-8");
     request.AddHeader("Accept", "application/json");

     try
     {
         // easy async support
         client.ExecuteAsync(request, response =>
         {
             Console.WriteLine("response content: " + response.Content);
             if (response.ResponseStatus == ResponseStatus.Completed)
             {
                 MessageBox.Show("errorMsg: " + response.ErrorMessage);
             }
         });
     }
     catch (System.Net.WebException ex)
     {
         MessageBox.Show(" "  + ex.InnerException.ToString());
     }
 }

В моем журнале я получаю это исключение:

Исключение типа «System.Net.WebException» возникло в System.Windows.ni.dll и не было обработано до границы управляемой/собственной.

Я даже не могу хранить какую-либо информацию в своем обработчике

// Code to execute on Unhandled Exceptions
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
    Console.WriteLine(" ---Application_UnhandledException---");
    if (Debugger.IsAttached)
    {
        // An unhandled exception has occurred; break into the debugger
        Debugger.Break();
    }
}

Как я могу получить больше информации о том, что не так?

Будем признательны за любую дополнительную информацию о правильном способе вызова WS.

Спасибо


person eeadev    schedule 06.12.2014    source источник
comment
Вы пробовали попробовать/поймать внутри вашей лямбды?   -  person Peter Torr - MSFT    schedule 08.12.2014
comment
да делал, как в коде, но ничего не перехватывая...   -  person eeadev    schedule 08.12.2014
comment
Нет, внутри лямбды нет обработки исключений. У вас есть это только вокруг вызова ExecuteAsync.   -  person Peter Torr - MSFT    schedule 09.12.2014
comment
Эта ссылка хорошо ответила на ваш вопрос и объяснила его. blogs.msdn.microsoft.com/ptorr /2014/12/10/асинхронные-исключения-в-с   -  person Hamed Hajiloo    schedule 15.11.2019


Ответы (2)


источник: https://blogs.msdn.microsoft.com/ptorr/2014/12/10/async-exceptions-in-c/

  using System;
  using System.Runtime.CompilerServices;
  using System.Threading;
  using System.Threading.Tasks;

  namespace AsyncAndExceptions
  {
class Program
{
  static void Main(string[] args)
  {
    AppDomain.CurrentDomain.UnhandledException += (s, e) => Log("*** Crash! ***", "UnhandledException");
    TaskScheduler.UnobservedTaskException += (s, e) => Log("*** Crash! ***", "UnobservedTaskException");

    RunTests();

    // Let async tasks complete...
    Thread.Sleep(500);
    GC.Collect(3, GCCollectionMode.Forced, true);
  }

  private static async Task RunTests()
  {
    try
    {
      // crash
      // _1_VoidNoWait();

      // crash 
      // _2_AsyncVoidAwait();

      // OK
      // _3_AsyncVoidAwaitWithTry();

      // crash - no await
      // _4_TaskNoWait();

      // crash - no await
      // _5_TaskAwait();

      // OK
      // await _4_TaskNoWait();

      // OK
      // await _5_TaskAwait();
    }
    catch (Exception ex) { Log("Exception handled OK"); }

    // crash - no try
    // await _4_TaskNoWait();

    // crash - no try
    // await _5_TaskAwait();
  }

  // Unsafe
  static void _1_VoidNoWait()
  {
    ThrowAsync();
  }

  // Unsafe
  static async void _2_AsyncVoidAwait()
  {
    await ThrowAsync();
  }

  // Safe
  static async void _3_AsyncVoidAwaitWithTry()
  {
    try { await ThrowAsync(); }
    catch (Exception ex) { Log("Exception handled OK"); }
  }

  // Safe only if caller uses await (or Result) inside a try
  static Task _4_TaskNoWait()
  {
    return ThrowAsync();
  }

  // Safe only if caller uses await (or Result) inside a try
  static async Task _5_TaskAwait()
  {
    await ThrowAsync();
  }

  // Helper that sets an exception asnychronously
  static Task ThrowAsync()
  {
    TaskCompletionSource tcs = new TaskCompletionSource();
    ThreadPool.QueueUserWorkItem(_ => tcs.SetException(new Exception("ThrowAsync")));
    return tcs.Task;
  }
  internal static void Log(string message, [CallerMemberName] string caller = "")
  {
    Console.WriteLine("{0}: {1}", caller, message);
  }
}

}

person hamish    schedule 29.03.2017

Причина в том, что исключения из асинхронного метода Void не могут быть перехвачены с помощью Catch.

Асинхронные методы void имеют другую семантику обработки ошибок. Когда исключение генерируется из асинхронной задачи или метода асинхронной задачи, это исключение фиксируется и помещается в объект Task. С асинхронными методами void объект Task отсутствует, поэтому любые исключения, выброшенные из асинхронного метода void, будут вызваны непосредственно в SynchronizationContext, который был активен при запуске асинхронного метода void.

Ошибка заключается в том, что асинхронный метод void необходимо заменить на асинхронный метод Task.

Источник находится на msdn здесь и здесь

person eeadev    schedule 09.12.2014
comment
Это только половина истории. Нет ничего плохого в методах async void, если исключения обрабатываются внутри самого метода. С другой стороны, преобразование метода для возврата Task<T> не поможет, если только кто-то не выполняет его await (или явно не получает Result) на другом конце - конечно, внутри try/catch. - person Peter Torr - MSFT; 10.12.2014
comment
@PeterTorr, не могли бы вы привести пример второго случая? - person eeadev; 10.12.2014
comment
Конечно, что-то добавил здесь - person Peter Torr - MSFT; 10.12.2014