Lanzar la Excepción VS Retorno de Error dentro de un Try,Catch,Finally

Estoy bastante seguro de que ya sé la respuesta, pero todavía estoy curioso lo de la opinión es sobre el manejo de un error dentro de un Try,Catch,Finally bloque — pero cuando lo repites a ti mismo.

Por CIERTO, no estoy hablando acerca de la Entrada del Usuario -, pero el uso que para un ejemplo porque es claro y corto

Considerar este fragmento de código…

try {    
    if (success) {
        return someSuccessMessage;
    }
    else {
        logError("User input not correct format");
        return someErrorMessage; //repeats itself
    }
}
catch (Exception ex) {
    logError(ex.Message);
    return someErrorMessage; //repeats itself
}

Decir que tenemos una función, que si no nos quieren devolver un mensaje de error porque la excepción es irrelevante — nuestra función no tuvo éxito y el usuario no necesita ningún detalle adicional.

He mantenido siempre la creencia de que si usted puede manejar el error, evitar la excepción, ya que no es excepcional, pero me preguntaba la opinión acerca de evitar repetir lo mismo una y así… Se podría hacer lo siguiente para evitar repetir lo mismo…

try {    
    if (success) {
        return someSuccessMessage;
    }
    else {
        throw new Exception("User input not correct format");
    }
}
catch (Exception ex) {
    logError(ex.Message);
    return someErrorMessage;
}

Este no es el mejor ejemplo, pero yo iba por la brevedad, para hacer el punto de la repetición de código.

Excepciones son conocidos a incurrir en una penalización de rendimiento, pero lo que son los pensamientos acerca de una situación como esta?

InformationsquelleAutor Hugoware | 2009-07-10

6 Kommentare

  1. 4

    Me pregunta la separación de los problemas aquí. A menos que esta función es parte de la interfaz de usuario, no debe preocuparse de los mensajes de error. Es debe estar lanzando excepciones en su lugar. El llamador de este método, si es parte de la interfaz de usuario, puede ser que desee para producir un mensaje de error por pantalla. Si la persona que llama se de un servicio web, entonces se podría producir un error de SOAP, que no podría usar el mismo mensaje (si se utiliza ningún mensaje en absoluto).

    También me gustaría sugerir fuertemente que usted registro de ex.ToString() y no ex.Mensaje.

  2. 3

    De la OMI, una Excepción debe ser lanzado sólo cuando está fuera de corrección de la situación. Usuario la introducción de un formato incorrecto es conocido y no lanzar ninguna Excepción.

    Tratar de Excepción como es catastrófico (centro de datos en un incendio, terremoto, etc.). De esta manera, podrás ver la diferencia entre el manejo de «regular error» y «Excepción».

    Y sí, lanzar y atrapar la Excepción costo un gran rendimiento, mejor es evitarlos.

  3. 2

    Extracto de la duplicación de código en una función, si usted siente que repetir lo mismo es un problema.

    error_code_t fail (string message) {
        logError(message);
        return someErrorMessage;
    }
    
    //...
    
    try {    
        if (success) {
            return someSuccessMessage;
        }
        else {
            return fail("User input not correct format");
        }
    }
    catch (Exception ex) {
        return fail(ex.Message);
    }
    

    Para ser honesto, yo no se preocupe acerca de la duplicación de un par de líneas en la misma función.

    • No estoy de acuerdo en la última frase. Puede aparecer como «no tan importante», a primera vista, eliminar la duplicación de un par de líneas, pero imagino que de la misma «leve repetición» en 10 diferentes métodos. La duplicación es el mal. Como dijo St Exupery : la perfección no cuando no hay nada que añadir, sino cuando no hay nada que quitar.
    • es el mal. «– no realmente. Como muchos programadores han señalado, «la Duplicación es mejor que el mal de la abstracción». Usted no debe deduplicación en la primera oportunidad, pero sólo después de que se ha demostrado ser un problema.
  4. 1

    En su caso, me acaba de devolver el mensaje de error (primer ejemplo), porque lanzar una excepción sólo para coger la línea 3 de abajo parece un poco extraño.

    Una cosa completamente diferente es que yo suelo evitar devolver códigos de error cuando sea posible – cuando tengo una situación de error, yo a través de una excepción y me cogerlo en el nivel más alto posible. De esta manera, el código no está llena de manejo de errores en todas partes y es mucho más fácil ver la lógica de negocio. En su caso (si el control es, por supuesto) el método que devuelve éxito podría haber arrojado una excepción en caso de error, y usted no tiene que hacer esta pregunta a todos 🙂

    Es cierto que las Excepciones son caros en C#, por tanto, no deberían ser objeto de abuso. Habiendo dicho que, cuando tiene un error, el 50ms o por lo golpeó en el rendimiento es generalmente irrelevante, por lo que tienden a utilizarlos para mantener el código limpio.

    • Yo debería haber publicado un ejemplo más complejo – El ejemplo es solo para ilustrar ella – estoy hablando de un ejemplo más extenso con más cosas. Tratando de evitar la repetición de código de control de errores. Gracias por la respuesta, aunque
  5. 1

    Yo estaría de acuerdo con su lógica, en su ejemplo, sin embargo lo que la excepción de hacer que usted piensa que usted está manejando en su manejo de excepciones bloque vs su programáticos de la prueba? Sospecho que la excepción de bloque de control es realmente un «sólo en caso de que algo ha sucedido». Por lo que realmente se reduce a que el manejo de excepciones de la regla.

    Si usted no necesita controlar una excepción y no a través de una arquitectónica distinta límite no se manejan. Si su en el borde de un componente de límite, usted podría querer envolver, colocar el original en el interior de la excepción.

    Si la funcionalidad estaba siendo llamado desde el código se desea probar el resultado con algún estatus de la representación como una respuesta (HRESULT es un buen ejemplo de ello. 0 == ÉXITO, != 0 == fallo) o el uso de excepciones.

    Prueba de errores programáticos o fallas de los componentes es donde el uso de las excepciones, si usted es validar la entrada del usuario en una interfaz de usuario que desee utilizar simplemente la lógica y el estado de la devolución de los códigos para ayudar a comunicar el error al usuario.

    Finalmente pensar acerca de la localización también. Si usted ondulación inglés un mensaje de error por el sistema y presentar a tus habla francesa de usuario que no sería útil y no quieres empezar de análisis de cadenas en la interfaz de usuario para generar la versión en francés, por lo que las excepciones son el camino a seguir, mientras que la carga de la excepción tiene suficiente información para generar una utilidad mensaje de error para que el usuario tome la acción correctiva.

    El uso de código de estado donde usted tiene una estrecha conexión entre los componentes y el componente de llamada sabe qué hacer en las diferentes condiciones del estado.

    Por CIERTO, puede Que desee para iniciar el seguimiento de pila, así como sólo el mensaje utilizando el método ToString() ya que le dará más información útil para resolver el problema.

    HTH

    • Gracias por tu respuesta – por CIERTO, – esto no es real código, simplemente era para ilustrar el punto 🙂
  6. 0

    en ese caso, me gustaría decir realmente el try/catch es innecesario, ya que su caso es más que el manejo adecuado de su error

    pero el de abajo es el estilo que cree que debe ser utilizado para las situaciones más complicadas

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea