C# Can';无法捕获从任务引发的异常
这件事让我挠头已有一段时间了。我不知道这个异常是在哪里抛出的。我到底应该在哪里发现这个异常?这是一个C# Can';无法捕获从任务引发的异常,c#,async-await,task,webexception,C#,Async Await,Task,Webexception,这件事让我挠头已有一段时间了。我不知道这个异常是在哪里抛出的。我到底应该在哪里发现这个异常?这是一个System.Net.WebException。我想我只是没有得到任务和异步/等待。我知道我正在创建其他线程,这非常好,但是我在哪里处理异常呢 远程服务器返回错误:(403)禁止。 代码如下: public async void sendRequest(string database, string table, string where, bool isPost, int deviceType)
System.Net.WebException
。我想我只是没有得到任务和异步/等待。我知道我正在创建其他线程,这非常好,但是我在哪里处理异常呢
远程服务器返回错误:(403)禁止。
代码如下:
public async void sendRequest(string database, string table, string where, bool isPost, int deviceType)
{
string urlQuery = Constants.URL_QUERY + database + "/" + table + "?" + where;
Debug.WriteLine("URL Query: " + urlQuery);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlQuery);
request.Method = isPost ? "POST" : "GET";
request.ContentType = "application/json";
try
{
Debug.WriteLine("getting response");
WebResponse response = await makeAsyncRequest(request);
Debug.WriteLine("response obtained");
finishRequest(response);
}
catch (WebException e)
{
Debug.WriteLine("WebException caught");
}
}
private async static Task<WebResponse> makeAsyncRequest(HttpWebRequest req)
{
Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(req.BeginGetResponse, req.EndGetResponse, null);
await task.ContinueWith(t =>
{
if (t.IsFaulted)
{
Debug.WriteLine("It's faulted.");
t.Exception.Handle((x) =>
{
if (x is WebException)
{
Debug.WriteLine("It's a web exception");
return true;
}
Debug.WriteLine("Exception?: " + x);
return false;
});
}
});
Debug.WriteLine("returning task");
return task.Result;
}
private static void finishRequest(WebResponse response)
{
Debug.WriteLine("finishRequest called");
}
输出窗口:
2014-10-07 14:05:05.104 FormsTemplateiOS[1568:53280] getting response
[0:] getting response
Thread started: #3
Thread started: <Thread Pool> #4
Thread started: <Thread Pool> #5
Thread started: <Thread Pool> #6
Thread started: <Thread Pool> #7
Thread started: #8
[0:]
2014-10-07 14:05:05.681 FormsTemplateiOS[1568:53326] It's faulted.
[0:] It's faulted.
[0:]
2014-10-07 14:05:05.804 FormsTemplateiOS[1568:53326] It's a web exception
[0:] It's a web exception
Unhandled Exception:
System.Net.WebException: The remote server returned an error: (403) Forbidden.
Unhandled Exception:
System.Net.WebException: The remote server returned an error: (403) Forbidden.
at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x0033b] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1718
at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00165] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1485
The program 'Mono' has exited with code 0 (0x0).
Debugging session ended.
2014-10-07 14:32:08.385 FormsTemplateiOS[1588:57008] getting response
[0:] getting response
Thread started: #3
Thread started: <Thread Pool> #4
Thread started: <Thread Pool> #5
Thread started: <Thread Pool> #6
Thread started: <Thread Pool> #7
Thread started: #8
Unhandled Exception:
System.Net.WebException: The remote server returned an error: (403) Forbidden.
Unhandled Exception:
System.Net.WebException: The remote server returned an error: (403) Forbidden.
at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x0033b] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1718
at System.Net.HttpWebRequest.SetResponseData (System.Net.WebConnectionData data) [0x00165] in ///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1485
The program 'Mono' has exited with code 0 (0x0).
Debugging session ended.
2014-10-07 14:32:08.385表单模板[1588:57008]获得响应
[0:]正在获取响应
线程已启动:#3
线程已启动:#4
线程已启动:#5
线程已启动:#6
线程已启动:#7
线程已启动:#8
未处理的异常:
System.Net.WebException:远程服务器返回错误:(403)禁止。
未处理的异常:
System.Net.WebException:远程服务器返回错误:(403)禁止。
位于///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1718中的System.Net.HttpWebRequest.CheckFinalStatus(System.Net.WebAsyncResult结果)[0x0033b]
位于///Library/Frameworks/Xamarin.iOS.framework/Versions/8.0.0.63/src/mono/mcs/class/System/System.Net/HttpWebRequest.cs:1485中的System.Net.HttpWebRequest.SetResponseData(System.Net.WebConnectionData)[0x00165]
程序“Mono”已退出,代码为0(0x0)。
调试会话已结束。
我知道我正在创建其他线程,这非常棒
不,事实上。你可能想读我的书
此外:
- 避免
异步无效
- 使用
代替wait
ContinueWith
private async static Task<WebResponse> MakeRequestAsync(HttpWebRequest req)
{
Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(req.BeginGetResponse, req.EndGetResponse, null);
try
{
return await task;
}
catch (WebException ex)
{
Debug.WriteLine("It's a web exception");
}
catch (Exception ex)
{
Debug.WriteLine("It's not a web exception.");
}
}
private async静态任务MakeRequestAsync(HttpWebRequest-req)
{
Task Task=Task.Factory.fromsync(req.BeginGetResponse,req.EndGetResponse,null);
尝试
{
返回等待任务;
}
捕获(WebException ex)
{
WriteLine(“这是一个web异常”);
}
捕获(例外情况除外)
{
WriteLine(“这不是web异常。”);
}
}
最后,请注意使用<代码> HTTPcli客< /代码>代替<代码> HttpWebRequest < /代码>。code>HttpClient是为async
使用而设计的
我知道我正在创建其他线程,这非常棒
不,事实上。你可能想读我的书
此外:
- 避免
异步无效
- 使用
代替wait
ContinueWith
private async static Task<WebResponse> MakeRequestAsync(HttpWebRequest req)
{
Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(req.BeginGetResponse, req.EndGetResponse, null);
try
{
return await task;
}
catch (WebException ex)
{
Debug.WriteLine("It's a web exception");
}
catch (Exception ex)
{
Debug.WriteLine("It's not a web exception.");
}
}
private async静态任务MakeRequestAsync(HttpWebRequest-req)
{
Task Task=Task.Factory.fromsync(req.BeginGetResponse,req.EndGetResponse,null);
尝试
{
返回等待任务;
}
捕获(WebException ex)
{
WriteLine(“这是一个web异常”);
}
捕获(例外情况除外)
{
WriteLine(“这不是web异常。”);
}
}
最后,请注意使用<代码> HTTPcli客< /代码>代替<代码> HttpWebRequest < /代码>。code>HttpClient是为
async
使用而设计的。。我不知道这个异常是在哪里引发的。您是否尝试查看StackTrace?将输出添加到question.Enable。调试器将在引发异常的地方停止。另一个选项是检查StackTraceTryto以处理以获取更多信息。我不知道这个异常是在哪里引发的。您是否尝试查看StackTrace?将输出添加到question.Enable。调试器将在引发异常的地方停止。另一个选项是检查StackTraceTryto以处理以获取更多信息如果任务不在单独的线程上,那么为什么它是System.Threading的一部分?这是出于历史原因<代码>任务最初是作为任务并行库的一部分引入的,它主要用于表示要在线程上执行的工作。它已经被重新调整用途,作为一个任意的“异步操作”使用。我需要能够设置请求头和方法来POST或GET。这可以通过HttpClient完成吗?滚动浏览属性和方法时,我没有看到任何允许这样做的内容。我尝试了以下代码。仍然没有捕获到相同的异常。我将把更新后的代码添加到问题中。@JaredPrice:“未捕获”是指它只是在调试器中被捕获吗?因为它将在运行时被捕获。如果任务不在单独的线程上,那么为什么它是System.Threading的一部分?这是出于历史原因<代码>任务最初是作为任务并行库的一部分引入的,它主要用于表示要在线程上执行的工作。它已经被重新调整用途,作为一个任意的“异步操作”使用。我需要能够设置请求头和方法来POST或GET。这可以通过HttpClient完成吗?滚动浏览属性和方法时,我没有看到任何允许这样做的内容。我尝试了以下代码。仍然没有捕获到相同的异常。我将把更新后的代码添加到问题中。@JaredPrice:“未捕获”是指它只是在调试器中被捕获吗?因为它将在运行时被catch
捕获。