[英]C# - Handle Exception and STOP Execution
讓我們說我有兩個班。 這是稱為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"));
}
}
此代碼由一個名為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方法調用中發生異常,則將處理該異常( Internet類末尾的WebException),然后在它之后停止執行代碼(ClientServiceSoapClient web_service ....)。
我怎樣才能做到這一點?
您可以在此處使用關鍵字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關鍵字。
標題要求停止執行並且不從函數返回。 因此,如果您不在main函數中,並且不想引發異常然后在main中再次捕獲它,則可以使用帶有退出代碼的Environment.Exit() 。https://msdn.microsoft。 COM / EN-US /庫/ ms681382(v = vs.85)
Environment.Exit(ERROR_INVALID_COMMAND_LINE)
您可以捕獲異常,對其進行處理,然后將其重新拋出,以使該方法不會再執行任何代碼。
try{
...
}catch(Exception ex){
// do something with ex
throw;
}
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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.