Digamos que tengo dos clases. Aquí está el código correspondiente para la primera clase que se llama 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"));
      }
}

Este código es llamado por una clase que se llama la Página principal.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);
      }
}

Lo que yo quiero es que si se produce una excepción en el doRequest llamada al método, se controla la excepción (WebException al final de la Internet de clase) y, a continuación, DEJE de ejecutar el código después (ClientServiceSoapClient web_service….).

¿Cómo puedo hacer esto?

InformationsquelleAutor Matthew | 2013-04-23

4 Comentarios

  1. 3

    Puede utilizar la palabra clave volver aquí (que se devuelve void). De hecho, he usado dos veces, tiene un vacío si la declaración, por lo que he rejigged un poco.

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

    Sin embargo, está utilizando un método asincrónico que no tiene sentido para mí! No debería ser llamado de forma Asincrónica si usted necesita para validar el resultado antes de continuar, debe ser hecho en serie. O bien, revisar el esperan palabra clave.

    • He tratado de su enfoque, sin embargo, el código después de la segunda vuelta todavía se está ejecutando. Si se produce una excepción, no quiero que el código se ejecute.
    • Actualizado el código, pruebe esto
    • El problema persiste 🙁 creo que es debido al hecho de que el servicio web funciona en un asyncrhonous modo.
    • Sí, pero si ese es el caso, entonces debe ser una llamada asincrónica, ya que se necesita saber el resultado antes de continging.
    • Tengo que usar asyncrhonous porque se trata de una aplicación móvil.
    • En ese caso, usted necesita usar el esperan palabra clave
    • Ok. Gracias Dave 🙂
    • Gracias 🙂 funcionó ahora 🙂

  2. 2

    El título está pidiendo para detener la ejecución y no de regresar de una función. Así que si usted no está en la función principal, y usted no quiere tirar una excepción y, a continuación, coger de nuevo en el principal, puede utilizar el Ambiente.Exit() con un código de Salida.. https://msdn.microsoft.com/en-us/library/ms681382(v=vs 85)

    Environment.Exit(ERROR_INVALID_COMMAND_LINE)
  3. 0

    Se puede coger excepción, hacer algo con él, y, a continuación, rethrow, así que no hay más código de este método se ejecuta.

    try{
       ...    
    }catch(Exception ex){
       //do something with ex
       throw;
    }
  4. 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
    }

Dejar respuesta

Please enter your comment!
Please enter your name here