#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> также часто является хорошим выбором).