Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';无法捕获从任务引发的异常_C#_Async Await_Task_Webexception - Fatal编程技术网

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
捕获。