2010-08-12 4 views
7

J'écris une application C# qui utilise l'automatisation pour contrôler un autre programme. Naturellement, ce programme doit fonctionner pour que mon programme fonctionne. Quand mon programme recherche l'application et ne la trouve pas, je voudrais lancer une exception (pour l'instant je pourrais bien sûr essayer d'ouvrir l'application, ou dire à l'utilisateur de l'ouvrir, ou ...). Dois-je implémenter une exception personnalisée - ou utiliser l'exception NotSupportedException existante (ou l'une des autres exceptions .NET). Si une exception personnalisée, que suggérez-vous? Je pensais mettre en œuvre une exception personnalisée que je l'appellerais MyAppNameException et ensuite utiliser le message pour déclarer quel était le problème? Y at-il des règles générales pour lancer des exceptions de manière à rendre votre programme plus lisible et plus convivial, ou est-ce que je ne fais que trop réfléchir :)?Quel type d'exception à lancer dans ce cas?

Merci!

Répondre

8
  1. D'abord, définir MyAppCustomException comme une classe de base abstraite. Puis, héritez-en avec AppNotFoundCustomException.

De cette façon, vous pouvez prendre toutes les exceptions de votre application, ou tout simplement spécifiques les.

Voici quelques exemples de code qui illustre le concept:

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

Et voici un client try/catch exemple:

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

En dérivant de 'System.Exception', [il est recommandé d'implémenter les trois constructeurs communs recommandés] (https://msdn.microsoft.com/fr-fr/library/87cdya3t%28v=vs.110% 29.aspx). Cela dit, dans la situation décrite dans la question, le fait de lancer une exception n'est peut-être pas la meilleure approche. Voir [la réponse] (http://stackoverflow.com/a/3471960/1497596) par @Hans Passant. – DavidRR

3

Le Framework Guidelines book que j'utilise indique que vous ne devez créer une exception personnalisée lorsque la La condition d'erreur peut être gérée par programme d'une manière différente des exceptions existantes. Dans votre cas, si vous vouliez créer une exception personnalisée afin de lancer un programme d'installation dorsal, cela est unique et je pense qu'une exception personnalisée serait acceptable.

Sinon, quelque chose de la hiérarchie System.Runtime.InteropServices.ExternalException peut être approprié.

+0

+1 pour créer uniquement des exceptions personnalisées si vous prévoyez de les gérer de manière personnalisée. Si vous pouvez réellement faire quelque chose programmaticially dans la situation que vous avez décrite, alors je irais avec ce que PostMan a suggéré. – jloubert

1

Oui, vous en faites trop. Rien de bon ne se produira quand vous lancerez une exception, à n'importe quelle exception, ce programme ne commencera pas magiquement à démarrer quand vous le ferez. Seules de mauvaises choses peuvent arriver, comme du code qui attrape cette exception et essaie de continuer. Ou personne ne l'attrape et obtient une boîte de dialogue Rapport d'erreurs Windows. Autant mettre en place une boîte de message et l'appeler un jour avec Environment.Exit().

Bien sûr, il pourrait être plus utile à l'utilisateur si vous démarrez réellement ce programme si vous trouvez qu'il ne fonctionne pas.

+0

+1 Je suis d'accord, à quoi sert l'exception dans ce cas. Il a 0 valeur. – JonH

0

Vous ne devriez certainement pas utiliser NotSupportedException, comme vous le suggérez, car votre application prend en charge la méthode en question. NotSupportedException est utilisé lorsqu'une interface ou une classe abstraite est implémentée, mais que certains membres ne sont pas complètement implémentés car ils n'ont aucun sens dans le contexte (lecture d'un flux de sortie, effacement d'une collection en lecture seule, etc.).Une correspondance plus proche est quelque chose InvalidOperationException, où un membre peut être utilisé, mais pas donné l'état actuel.

Vous dites "application", ce qui suggère un exécutable plutôt qu'un composant à utiliser par autre chose. Dans ce cas, vous n'allez pas faire exploser l'exception jusqu'au code appelant (puisqu'il n'y a pas de code appelant), mais soit ouvrir une boîte de dialogue (pour une application graphique), soit écrire dans Console.Error (pour une application console). Cela rend probable que vous allez simplement afficher la valeur de la propriété Message de l'exception, ou que vous avez juste besoin du type de classe pour marquer un message particulier. Soit simplement dériver AppNotRunningException d'Exception ou simplement utiliser Exception directement servira probablement parfaitement bien, selon lequel des deux vous trouvez le plus pratique.

Questions connexes