1

例外でコンソールに何かを書き込む側面があります。コンストラクターで例外をスローする基本クラスと、コンストラクターにアスペクトを持つ派生クラスがあります。

コンストラクターの派生クラスの側面が基本クラスの例外をキャッチすることを期待していますが、そうではありません。

これは設計によるものですか?これはバグですか?それとも私は何か間違ったことをしていますか?

サンプル コード (コンソール アプリケーション) は次のとおりです。

[Serializable]
public class OnExceptionWriteAspect : OnMethodBoundaryAspect
{
    public override void OnException(MethodExecutionEventArgs eventArgs)
    {
        Console.WriteLine("Exception catched on Aspect.");
    }
}

public class BaseClass
{
    public BaseClass()
    {
        throw new Exception();
    }
}

public class DerivedClass : BaseClass
{
    [OnExceptionWriteAspect]
    public DerivedClass()
        : base()
    {

    }
}

public class Program
{
    static void Main(string[] args)
    {
        try
        {
            new DerivedClass();
        }
        catch
        {
            Console.WriteLine("Exception catched on Main.");
        }
    }
}

出力は次のとおりです。

Main で例外がキャッチされました。

4

2 に答える 2

2

これは仕様によるものです。基本コンストラクターへの呼び出しの周りに例外ハンドラーを配置する方法はありません。MSIL コードは検証できません。

于 2009-12-11T19:35:04.893 に答える
0

via リフレクターを見るDerivedClassと、Aspect がDerivedClassのコンストラクターのみをラップしていることがわかります。

public class DerivedClass : BaseClass
{
    // Methods
    public DerivedClass()
    {
        MethodExecutionEventArgs ~laosEventArgs~1;
        try
        {
            ~laosEventArgs~1 = new MethodExecutionEventArgs(<>AspectsImplementationDetails_1.~targetMethod~1, this, null);
            <>AspectsImplementationDetails_1.MyTest.OnExceptionWriteAspect~1.OnEntry(~laosEventArgs~1);
            if (~laosEventArgs~1.FlowBehavior != FlowBehavior.Return)
            {
                <>AspectsImplementationDetails_1.MyTest.OnExceptionWriteAspect~1.OnSuccess(~laosEventArgs~1);
            }
        }
        catch (Exception ~exception~0)
        {
            ~laosEventArgs~1.Exception = ~exception~0;
            <>AspectsImplementationDetails_1.MyTest.OnExceptionWriteAspect~1.OnException(~laosEventArgs~1);
            switch (~laosEventArgs~1.FlowBehavior)
            {
                case FlowBehavior.Continue:
                case FlowBehavior.Return:
                    return;
            }
            throw;
        }
        finally
        {
            <>AspectsImplementationDetails_1.MyTest.OnExceptionWriteAspect~1.OnExit(~laosEventArgs~1);
        }
    }
}

public BaseClass()
{
    throw new Exception();
}

アスペクト継承を処理したい場合は、MulticastAttributeUsageを使用して見てください

于 2009-12-11T15:24:44.167 に答える