2014-12-06 5 views
0

Я пытаюсь вызвать веб-службу с помощью RestSharp (это должно быть сделано для WP8 и далее).System.Net.WebException не перехватывается на Windows Phone 8

Это мой метод срабатывает:

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 будет оценена по достоинству.

Благодаря

+0

Пытались Вас попробовать/поймать внутри вашего лямбда? –

+0

да я сделал, как в коде, но не перехватывая ничего ... – eeadev

+0

Нет, обработка исключений в лямбде отсутствует. У вас есть только вызов вызова ExecuteAsync. –

ответ

0

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

«Методы Async void имеют разную семантику обработки ошибок. Когда исключение выбрасывается из задачи async Task или async Task, это исключение захватывается и помещается в объект Task. С помощью методов async void нет объект Task, поэтому какое-либо исключение, выброшенное из метода асинхронных пустот будет поднято прямо на SynchronizationContext, который был активен, когда метод асинхронных недействительным начал»

ошибки в том, что метод асинхронных недействительный должен быть изменен на асинхронный Вместо этого задайте метод.

Источник на MSDN here и here

+1

Это только половина истории. Нет ничего плохого в методах async void **, если ** исключение обрабатывается внутри самого метода. С другой стороны, преобразование метода для возврата «Задача » не поможет, если кто-то не ждет его (или явно получает «Результат») на другом конце - внутри 'try' /' catch' конечно. –

+0

@PeterTorr, не могли бы вы привести пример этого второго случая? – eeadev

+6

Конечно, добавил что-то [здесь] (http://blogs.msdn.com/b/ptorr/archive/2014/12/10/async-amp-exceptions-in-c.aspx) –

0

источник: 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); 
    } 
} 

}