我有一个简单的try / catch块
try
{
// Open the connection
_connection.Open(); // [1]
}
catch( OracleException ex ) // [2]
{
// Handle the exception
int x = ex.ErrorCode;
}
永远不会执行catch并且运行时报告'[1]处的'OracleException未处理',这让我头疼。显然,我有一个关联异常类型的catch语句。我甚至在[2]尝试了完全限定类型的Oracle.DataAccess.Client.OracleException,但仍然没有处理异常。
我能够实际捕获catch的唯一方法是在[2]处捕获System.Exception。是什么造成了这种奇怪的行为?
答案 0 :(得分:4)
您是否正在动态加载程序集,可能使用Assembly.LoadFrom
或类似的东西?如果是这样,您可能会遇到多种类型加载到不同加载上下文中的类型。
加载到不同上下文中的程序集呈现具有不同身份的相同类型,因此它们不匹配类型相等性检查等。
来自MSDN
加载上下文包含程序集 通过探测发现:在GAC中,在a 如果运行时是主机程序集存储 托管,或在ApplicationBase和 应用程序的PrivateBinPath 域。 Load的大多数重载 方法将程序集加载到此 上下文。
load-from context包含 用户的程序集 提供了未包含在内的路径 通过探测搜索的目录。 LoadFrom,CreateInstanceFrom和 ExecuteAssembly是例子 按路径加载的方法。
当然这只是猜测,所以我可能错了。
答案 1 :(得分:2)
可能是抛出Oracle.DataAccess.Client.OracleException而不是Oracle.DataAccess.Client.OracleException。我知道这听起来很奇怪,但是可以将两个具有完全相同名称的类型加载到给定的AppDomain中。
试试这个......
try
{
// Open the connection
_connection.Open(); // [1]
}
catch( Exception ex ) // [2]
{
if (ex.GetType() == typeof(OracleException)) Debug.WriteLine("is match");
else Debug.WriteLine ("is not match");
// Handle the exception
int x = ex.ErrorCode;
}
另一种可能性是异常被包装。您可能会收到包含OracleException的InvalidOperationException。
最后,错误可能就在你的try块之后。您误读了堆栈跟踪或堆栈跟踪中的行号是错误的。两者都发生在我身上。
答案 2 :(得分:1)
您可能希望捕获更一般的DbException
。
try
{
// Open the connection
_connection.Open(); // [1]
}
catch( DbException ex ) // [2]
{
// Handle the exception
int x = ex.ErrorCode;
}