Использование Unity 2.0 для обработки исключения

#unity-container #aop

#unity-контейнер #aop

Вопрос:

Когда я использую Unity 2.0 для обработки исключений, у меня возникла некоторая проблема, как показано ниже:

 public class TraceBehavior : IInterceptionBehavior
{
    public IEnumerable<Type> GetRequiredInterfaces()
    {
        return Type.EmptyTypes;
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        Console.WriteLine(string.Format("Invoke method:{0}",input.MethodBase.ToString()));
        IMethodReturn result = getNext()(input, getNext);
        if (result.Exception == null)
        {
            Console.WriteLine("Invoke successful!");
        }
        else 
        {
            Console.WriteLine(string.Format("Invoke faild, error: {0}", result.Exception.Message));
            result.Exception = null;
        }
        return resu<
    }

    public bool WillExecute { get { return true; } }
}
  

Я установил результат.Exception = null (это означает, что я разрешил исключение и мне не нужно создавать его снова.)

Однако для меня это создает исключение.

Ответ №1:

Это не так, как это работает. Не устанавливайте результат.Исключение, вместо этого возвращает входные данные.CreateMethodReturn(newReturnValues).

Комментарии:

1. Большое вам спасибо. Но «ввод. CreateMethodReturn(newReturnValues)» недопустимо, я не нашел type-newReturnValues.

2. Это не тип, я просто вставил значение. Укажите возвращаемое значение здесь. Если перехватывается метод void, введите туда значение null.

3. newReturnValues представляет возвращаемое значение функции. Предполагая, что GetNext() выдал исключение, и вы не хотите его повторно выдавать, вам придется вернуть некоторое значение из функции.

4. @ChrisTavares огромное спасибо за этот ответ. Итак, знайте, проблема в том, что если возвращаемый тип является примитивным ( ByVal ) типом, я не могу вернуть, null если я это сделаю, это вызовет другое исключение при возврате. Есть ли способ обойти это или я могу определить, является ли возвращаемый тип ByVal ?

5. Если это тип значения, выберите возвращаемое значение. верните 0, или -1, или 6.02e23. Это зависит от вас, и какой будет разумный ответ, основанный на вашем поведении при перехвате и его предназначении. Вы можете использовать API отражения, чтобы выяснить, каков тип возвращаемого значения и какие потенциально допустимые значения следует возвращать (default<T> также часто является хорошим выбором).