2010-08-12 15 views
7

Estoy escribiendo una aplicación C# que usa la automatización para controlar otro programa. Naturalmente, ese programa debe estar ejecutándose para que mi programa funcione. Cuando mi programa busca la aplicación y no puede encontrarla, me gustaría lanzar una excepción (por ahora más tarde, por supuesto, podría intentar abrir la aplicación, o decirle al usuario que la abra, o ...).¿Qué tipo de excepción arrojar en este caso?

Debo implementar una excepción personalizada o utilizar la NotSupportedException existente (o una de las otras excepciones de .NET). Si es una excepción personalizada, ¿qué sugerirías? Estaba pensando en implementar una excepción personalizada. Lo llamaría MyAppNameException y luego simplemente usaría el mensaje para declarar cuál era el problema.

¿Hay alguna regla general para lanzar excepciones de forma que su programa sea más legible y fácil de usar, o estoy simplemente pensando demasiado :)?

Gracias!

Respuesta

8
  1. Primero, defina MyAppCustomException como una clase base abstracta.

  2. A continuación, heredar de él con AppNotFoundCustomException.

De esta manera se puede tomar todos los excepciones a su aplicación, o simplemente específicos queridos.

Aquí hay un código de ejemplo que ilustra el concepto:

public abstract class MyAppCustomException : System.Exception 
{ 
    internal MyAppCustomException(string message) 
     : base(message) 
    { 
    } 

    internal MyAppCustomException(string message, System.Exception innerException) 
     : base(message,innerException) 
    {    
    } 
} 

public class AppNotFoundCustomException : MyAppCustomException 
{ 
    public AppNotFoundCustomException(): base("Could not find app") 
    { 
    } 
} 

Y aquí es un cliente try/catch ejemplo:

try 
{ 
    // Do Stuff 
} 
catch(AppNotFoundCustomException) 
{ 
    // We know how to handle this 
} 
catch(MyAppCustomException) // base class 
{ 
    // we don't know how to handle this, but we know it's a problem with our app 
} 
+0

Cuando se deriva de 'System.Exception', [es una buena práctica implementar los tres constructores comunes recomendados] (https://msdn.microsoft.com/en-us/library/87cdya3t%28v=vs.110% 29.aspx). Dicho esto, en la situación descrita en la pregunta, lanzar una excepción puede no ser el mejor enfoque. Ver [la respuesta] (http://stackoverflow.com/a/3471960/1497596) por @Hans Passant. – DavidRR

3

El Framework Guidelines book que utilizo indica que sólo se debe crear una excepción personalizada cuando el la condición de error se puede manejar mediante programación de una manera diferente a cualquier excepción existente.

En su caso, si desea crear una excepción personalizada para iniciar un programa de instalación de back-end, eso es único y creo que una excepción personalizada estaría bien.

De lo contrario, algo de la jerarquía System.Runtime.InteropServices.ExternalException puede ser apropiado.

+0

+1 solo para crear excepciones personalizadas si planea manejarlas de forma personalizada. Si realmente puede hacer algo programáticamente en la situación que ha descrito, entonces iría con lo que PostMan sugirió. – jloubert

1

Sí, te estás excediendo. Nada bueno va a suceder cuando lanzas una excepción, cualquier excepción, ese programa no va a comenzar a ejecutarse mágicamente cuando lo haces. Solo pueden suceder cosas malas, como algún código que capture realmente esa excepción y trate de continuar. O nadie lo detecta y obtiene un cuadro de diálogo Informe de error de Windows. Podría poner un cuadro de mensaje y llamarlo día con Environment.Exit().

Por supuesto, podría ser más útil para el usuario si realmente inicia ese programa si descubre que no se está ejecutando.

+0

+1 Acepto, de qué sirve la excepción en este caso. Tiene 0 valor. – JonH

0

No debe utilizar NotSupportedException, como sugiere, porque su aplicación admite el método en cuestión. NotSupportedException se usa cuando se implementa una interfaz o clase abstracta, pero algunos miembros no se implementan completamente ya que no tienen sentido en el contexto (lectura de una secuencia de salida, borrado de una colección de solo lectura, etc.).

Una coincidencia más cercana es algo InvalidOperationException, donde se puede usar un miembro, pero no se le da el estado actual.

Usted dice "aplicación", que sugiere un ejecutable en lugar de un componente para ser utilizado por otra cosa. En este caso, no se agregará la excepción al código de llamada (ya que no hay código de llamada), pero se generará un diálogo (para una aplicación GUI) o se escribirá en Console.Error (para una aplicación de consola). Esto hace que sea probable que muestre el valor de la propiedad Mensaje de la excepción, o que solo necesite el tipo de clase para marcar un mensaje en particular. O simplemente derivando AppNotRunningException de Exception o simplemente usando Exception directamente, probablemente le servirá perfectamente, dependiendo de cuál de los dos le resulte más conveniente.

Cuestiones relacionadas