0

多くはApplicationExceptionsであり、処理されてエラーレポートに記録されるため、アプリケーションによってスローされる例外にローカリゼーションを追加する必要があります。理想的には、ApplicationExceptionを継承して、リソースキーと引数を渡すことができる新しい例外を作成し、リソース情報から例外メッセージを作成できるようにします。残念ながら(私は思うに)例外にメッセージを設定する唯一の方法はNew()...

私は次のようなものが欲しいです:

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

ただし、最初の行のメッセージは読み取り専用であるため、MyBase.New()しか使用できません。

ローカライズされた文字列を例外ハンドラーに取り込む方法に関する推奨事項はありますか?いくつかの異なる例外でこれが必要になりますが、ローカライズされた文字列を取得して例外を作成する例外作成関数の方法をとることができますが、スタック情報は間違っています。また、スローの前に本体を使いすぎないようにします。これは、フローの読みやすさに明らかに影響を及ぼし始めるためです。

4

2 に答える 2

2

これが私がしていることのサンプルです。EmillException は 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); }
        }
    }
}
于 2008-11-13T20:17:05.343 に答える
0

これを見てください:

http://visualstudiomagazine.com/features/article.aspx?editorialsid=2562

ローカリゼーションに対処する必要はありませんが、それは理にかなっています。

于 2008-12-01T14:26:25.453 に答える