2008-11-13 6 views
0

Je dois ajouter la localisation aux exceptions émises par mon application, car beaucoup sont des exceptions d'application et sont traitées et consignées dans un rapport d'erreurs. Idéalement je veux créer une nouvelle exception, imitant d'ApplicationException que je peux passer la clé de ressource aussi bien que des arguments, de sorte que le messsage d'exception puisse être construit à partir des informations de ressource. Malheureusement (je pense) la seule façon de régler le message dans une exception est dans le Nouveau() ...Suggestions pour localiser les exceptions

Je voudrais quelque chose comme:

public class LocalizedException 
    Inherits ApplicationException 

public Sub New(ResourceKey as string, arg0 as Object) 
    MyBase.New() 
    ' get the localized text' 
    Dim ResMan as New Global.System.Resources.ResourceManager("AppName.ExceptionResources", _ 
    System.Reflection.Assembly.GetExecutingAssembly) 
    Dim LocalText as string = ResMan.GetString(ResourceKey) 
    Dim ErrorText as String = "" 
    Try 
     Dim ErrorText = String.Format(LocalText, arg0) 
    Catch 
     ErrorText = LocalText + arg0.ToString() ' in case String.Format fails' 
    End Try 
    ' cannot now set the exception message!' 
End Sub 
End Class 

Cependant, je ne peux avoir MyBase.New () en tant que première ligne Le message est ReadOnly

Est-ce que quelqu'un a des recommandations sur la façon d'obtenir des chaînes localisées dans le gestionnaire d'exceptions? J'en aurai besoin dans quelques exceptions différentes, bien que cela puisse aller dans le sens d'une fonction de création d'exception qui récupère la chaîne localisée et crée l'exception, bien que l'information de pile soit alors erronée. Je ne veux pas non plus trop dans le corps principal avant le Throw car il commence évidemment à empiéter sur la lisibilité du flux.

Répondre

2

Voici un exemple de ce que je fais. EmillException hérite de ApplicationException.


namespace eMill.Model.Exceptions 
{ 
    public sealed class AccountNotFoundException : EmillException 
    { 
     private readonly string _accountName; 

     public AccountNotFoundException(string accountName) 
     { 
      _accountName = accountName; 
     } 

     public override string Message 
     { 
      get { return string.Format(Resource.GetString("ErrAccountNotFoundFmt"), _accountName); } 
     } 
    } 
} 
Questions connexes