System.Net.WebException 未在 Windows Phone 8 上截获

本文关键字:Phone Windows Net WebException 未在 System | 更新日期: 2023-09-27 18:33:23

我正在尝试使用RestSharp调用Web服务(这必须为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 的正确方式的任何其他信息将不胜感激。

谢谢

System.Net.WebException 未在 Windows Phone 8 上截获

来源: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);
  }
}

}

原因是异步

void 方法的异常无法通过 catch 捕获。

异步 void 方法具有不同的错误处理语义。当一个 异常从异步任务或异步任务方法中抛出,即 捕获异常并将其放置在任务对象上。具有异步空 方法,则没有 Task 对象,因此从 异步无效方法将直接在 同步异步 void 方法时处于活动状态的上下文 开始

错误是需要将异步 void 方法更改为异步任务方法。

源在 msdn 上 这里 和 这里