2013-04-23 76 views
0

让我们说我有两个类。这里是被称为互联网第一类中的相关代码:C# - 句柄异常并停止执行

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")); 
     } 
} 

此代码是由一类调用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); 
     } 
} 

我想的是,如果一个在doRequest方法调用中发生异常,将处理该异常(WebException在类的末尾),然后停止执行后面的代码(ClientServiceSoapClient web_service ....)。

我该怎么做?

回答

3

你可以在这里使用关键字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; 
       } 
     } 

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

+0

我已经尝试了你的方法,但是第二次返回后的代码仍在执行。如果发生异常,我不希望该代码执行。 – Matthew 2013-04-23 14:06:04

+0

@Mthethew更新了代码,试试这个 – Dave 2013-04-23 14:07:03

+0

问题仍然存在:(我认为这是由于Web服务以异步模式运行的事实。 – Matthew 2013-04-23 14:10:02

0

您可以捕获异常,对其执行某些操作,然后重新抛出异常,以避免执行此方法的其他代码。

try{ 
    ...  
}catch(Exception ex){ 
    // do something with ex 
    throw; 
} 
0
try 
{ 
    net.doRequest(); 
} 
catch(Exception e) 
{ 
    if(e is WebException) 
    { 
     //handle appropriately 
     return; //will exit the method 
    } 
    else 
     throw; //good idea to throw unexpected exceptions anyway 
} 
2

标题被要求停止执行,而不是从函数返回。所以,如果你是不是在主函数,你不想抛出一个异常,然后在主再次抓住它,你可以用一个退出代码使用Environment.Exit().. https://msdn.microsoft.com/en-us/library/ms681382(v=vs.85)

Environment.Exit(ERROR_INVALID_COMMAND_LINE)