C# - 处理异常和停止执行

Mat*_*hew 1 c# service exception-handling exception web

假设我有两个班级。这是名为Internet的第一类的相关代码:

public void doRequest()
{
     string URL = "http://localhost:4000/HomePage.aspx";
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
     request.Method = "POST";
     request.ContentType = "application/x-www-form-urlencoded";
     request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
}

public void GetRequestStreamCallback(IAsyncResult callbackResult)
{
     HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
     Stream postStream = myRequest.EndGetRequestStream(callbackResult);
     byte[] byteArray = Encoding.UTF8.GetBytes("Test Message");
     postStream.Write(byteArray, 0, byteArray.Length);
     postStream.Close();
     myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest);
}

public void GetResponsetStreamCallback(IAsyncResult callbackResult)
{
     HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
     HttpWebResponse response = null;
     try
     {
          response = (HttpWebResponse)request.EndGetResponse(callbackResult);
          StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream());
          string result = httpWebStreamReader.ReadToEnd();
      }
      catch (WebException)
      {
          Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("Error: Could not reach the web service"));
      }
}
Run Code Online (Sandbox Code Playgroud)

此代码由名为 MainPage.xaml.cs 的类调用:

private void Button_LogIn_Click(object sender, RoutedEventArgs e)
{
     Internet net = new Internet();
     bool check = net.checkInternet();
     if (check.Equals(false))
     {
     }
     else
     {
         net.doRequest();
         ClientServiceSoapClient web_service = new ClientServiceSoapClient();
         web_service.LogInCompleted += new System.EventHandler<LogInCompletedEventArgs>(LogInComplete);
         web_service.LogInAsync(TextBox_Username.Text, TextBox_Password.Password);
      }
}
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果在 doRequest 方法调用中发生异常,则处理异常(Internet类末尾的 WebException ),然后在它之后停止执行代码(ClientServiceSoapClient web_service....)。

我怎样才能做到这一点?

Dav*_*ave 6

您可以在此处使用关键字return(它将返回 void)。我实际上已经使用了两次,你有一个空的 if 语句,所以我重新调整了一下。

        private void Button_LogIn_Click(object sender, RoutedEventArgs e)
        {
            Internet net = new Internet();
            bool check = net.checkInternet(); 

            if (check.Equals(false))
                  return;

                try
                {
                    await net.doRequest(); //UPDATED THIS LINE
                    ClientServiceSoapClient web_service = new ClientServiceSoapClient();
                    web_service.LogInCompleted += new System.EventHandler<LogInCompletedEventArgs>(LogInComplete);
                    web_service.LogInAsync(TextBox_Username.Text, TextBox_Password.Password);
                }
                catch
                {
                    //do not throw an error, instead just use the return keyword!
                    return;
                }   
        }
Run Code Online (Sandbox Code Playgroud)

但是,您使用的异步方法对我来说没有意义!如果您需要在继续之前验证结果,则不应以异步方式调用它,而应以串行方式进行调用。或者,查看await关键字。