2
try
{
}
catch (Exception objEx)
{
    clsLog.blnLogError(this.GetType().Name, MethodBase.GetCurrentMethod().Name, String.Format("Error In {0}...", MethodBase.GetCurrentMethod().Name), objEx.Message);
}

これは私のコードであり、次のようなものが必要です。

catch (MyException objEx)
{
}

class MyException
{
    method()
    {
        //method overload with necessary parameters.
        clsLog.blnLogError(this.GetType().Name, MethodBase.GetCurrentMethod().Name, String.Format("Error In {0}...", MethodBase.GetCurrentMethod().Name), objEx.Message);
    }
}

その例外クラスでは、毎回書き込むのではなく、現在のクラス名とメソッド名を取得する必要があります。

これを達成する方法は?

アップデート

[Serializable]
public class MyException : Exception
{
    public MyException(string message, Exception innerException, object obj)
        : base(message, innerException)
    {
    }
}
try
{
    int f = int.Parse("d");
}
catch (MyException objEx)
{
}

例外をキャッチしていないため、エラーをスローするメソッド名、クラス名が必要です。

4

1 に答える 1

7

これは継承によって行うことはできません。拡張メソッドを作成して、自分で宣言したかどうかに関係なく、すべての例外タイプでロギング メソッドを呼び出すことができるようにする必要があります。

拡張メソッドを作成するには、作業を行う静的メソッドを含む静的クラスを作成します。メソッドの最初の引数の前にキーワード を追加し、thisこのメソッドを最初のパラメーターの型のオブジェクトのメンバー メソッドのように呼び出すことができることをコンパイラーに示します (この場合はException)。

public static class ExceptionExtensions
{
    public static void Log(this Exception ex)
    {
        var stackTrace = new StackTrace();
        var callingMethod = stackTrace.GetFrame(1).GetMethod();
        var methodName = callingMethod.Name;
        var className = callingMethod.DeclaringType.Name;
        clsLog.blnLogError(className, methodName, string.Format("Error In {0}...", methodName), ex.Message);
    }
}

次に、すべての例外でそのメソッドを呼び出すことができます。

try
{
    int f = int.Parse("d");
}
catch(Exception ex)
{
    ex.Log();
}

拡張メソッドの詳細については、「C# プログラミング ガイド」を参照してください。

于 2013-10-21T15:14:52.570 に答える