gpt4 book ai didi

c# - 为什么在调用 ExceptionPolicy.HandleException 时会出现 System.InvalidOperationException?

转载 作者:行者123 更新时间:2023-11-30 14:00:30 25 4
gpt4 key购买 nike

我正在开发一个测试程序,以帮助我了解 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling 框架的工作原理。该程序定义了几种自定义异常类型并将自定义异常处理程序与每种类型相关联。在运行时,程序会提示用户抛出异常的类型,抛出异常,并使用异常处理框架为异常类型调用适当的异常处理程序:

using System;
using System.Collections.Specialized;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;

namespace ConsoleApplication1
{
public class AException : Exception { public AException(string message) : base(message) { } }
public class BException : Exception { public BException(string message) : base(message) { } }
public class BBException : BException { public BBException(string message) : base(message) { } }

public class WrapperException : Exception
{
public WrapperException(Exception innerException)
: base("Wrapped exception: [" + innerException.Message + "]", innerException) { }
}

public class MyExceptionHandler<T> : IExceptionHandler
{
protected NameValueCollection Ignore { get; set; }
public MyExceptionHandler(NameValueCollection ignore)
{
Ignore = ignore;
}

#region IExceptionHandler Members

public virtual Exception HandleException(Exception exception, Guid handlingInstanceId)
{
if (exception is T)
{
Console.WriteLine("Exception Handled:");
Console.WriteLine(" Expected Type : [{0}]", typeof(T).ToString());
Console.WriteLine(" Actual Type : [{0}]", exception.GetType().ToString());
Console.WriteLine(" Message : [{0}]", exception.Message);
Console.WriteLine();
}
else
{
Console.WriteLine("Unexpected Exception Type: [{0}]", exception.GetType().ToString());
}
return exception;
}

#endregion
}

[ConfigurationElementType(typeof(CustomHandlerData))]
public class AExceptionHandler : MyExceptionHandler<AException>
{
public AExceptionHandler(NameValueCollection ignore) : base(ignore) { }
}

[ConfigurationElementType(typeof(CustomHandlerData))]
public class BExceptionHandler : MyExceptionHandler<BException>
{
public BExceptionHandler(NameValueCollection ignore) : base(ignore) { }
}

[ConfigurationElementType(typeof(CustomHandlerData))]
public class ExceptionHandler : MyExceptionHandler<Exception>
{
public ExceptionHandler(NameValueCollection ignore) : base(ignore) { }

public override Exception HandleException(Exception exception, Guid handlingInstanceId)
{
var wrapper = new WrapperException(exception);
return base.HandleException(wrapper, handlingInstanceId);
}
}


class Program
{
static void ThrowSomething()
{
Console.Write("Enter the exception type: ");
var x = Console.ReadLine();
if (x.Equals("a"))
{
throw new AException(x);
}
else if (x.Equals("b"))
{
throw new BException(x);
}
else if (x.Equals("bb"))
{
throw new BBException(x);
}
else
{
throw new Exception(x);
}
}

static void Main(string[] args)
{
ExceptionManager xm = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
while (true)
{
//xm.Process(ThrowSomething, "Policy");
try
{
ThrowSomething();
}
catch(Exception ex)
{
Exception exToThrow = null;
if (ExceptionPolicy.HandleException(ex, "policy", out exToThrow))
{
if (exToThrow == null)
{
throw;
}
else
{
throw exToThrow;
}
}
}
Console.WriteLine();
}
}
}
}

在这个程序的第一次迭代中,我使用了 ExceptionManager.Process() 方法来调用我的 ThrowSomething() 方法。使用这种方法,一切都很好。然后我修改了 Main 以使用 ExceptionPolicy.HandleException() 代替。当我这样做时,我开始遇到这个异常:

Unhandled Exception: Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type ExceptionPolicyImpl, key "policy" ---> Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl", name = "policy". Exception occurred while: while resolving. Exception is: InvalidOperationException - The type ExceptionPolicyImpl has multiple constructors of length 2. Unable to disambiguate.

我的 App.config 文件包含以下内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>
<exceptionHandling>
<exceptionPolicies>
<add name="Policy">
<exceptionTypes>
<add name="AException" type="ConsoleApplication1.AException, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
postHandlingAction="None">
<exceptionHandlers>
<add type="ConsoleApplication1.AExceptionHandler, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
name="AExceptionHandler" />
</exceptionHandlers>
</add>
<add name="BException" type="ConsoleApplication1.BException, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
postHandlingAction="None">
<exceptionHandlers>
<add type="ConsoleApplication1.BExceptionHandler, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
name="BExceptionHandler" />
</exceptionHandlers>
</add>
<add name="All Other Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="NotifyRethrow">
<exceptionHandlers>
<add type="ConsoleApplication1.ExceptionHandler, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
name="ExceptionHandler" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
</exceptionPolicies>
</exceptionHandling>
</configuration>

谁能告诉我为什么会出现此异常以及如何解决该问题?

最佳答案

好吧,我觉得自己很蠢。问题是用小写字母“p”而不是大写字母“P”拼写“policy”。换行

if (ExceptionPolicy.HandleException(ex, "policy", out exToThrow))

if (ExceptionPolicy.HandleException(ex, "Policy", out exToThrow))

解决了问题。

关于c# - 为什么在调用 ExceptionPolicy.HandleException 时会出现 System.InvalidOperationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10625764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com