我正在尝试使用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的适当方式的附加信息都将不胜感激。
谢谢
发布于 2014-12-09 08:53:20
原因是无法用Catch捕获异步空方法的异常。
异步空方法有不同的错误处理语义。当异常从异步任务或异步任务方法中抛出时,该异常将被捕获并放置在Task对象上。对于异步空方法,没有任务对象,因此异步空方法中抛出的任何异常都将直接在异步空方法启动时处于活动状态的SynchronizationContext上引发
错误是异步空方法需要改为异步任务方法。
源位于msdn 这里和这里上。
发布于 2017-03-29 23:10:19
来源: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);
}
}}
https://stackoverflow.com/questions/27330014
复制相似问题