【发布时间】:2010-10-05 03:40:04
【问题描述】:
我正在使用 Compact Framework 3.5 / VS2008。我对 TypeLoadException 的行为非常奇怪。以下代码会引发此错误。原因是数据库连接有问题。但是,由于某些未知原因,此内部异常丢失并且不包含在 TypeLoadException 中。
try
{
settingsFromDb = SettingsFromDbManager.Instance;
}
catch (Exception ex)
{
throw ex; // BREAKPOINT HERE
}
如果我们查看下面的 SettingsFromDbManager 类,可以看出它是一个简单的单例类。 Load() 方法中发生数据库错误。我没有在示例中包含此代码。如果我在下面示例中指示的位置放置一个断点,我会看到一个数据库错误。不幸的是,如果我在上面代码中指示的位置放置一个断点,那么我得到的只是没有内部异常的 TypeLoadException。没有任何迹象表明发生了数据库问题。这很糟糕:(有谁知道为什么会发生这种奇怪的行为??
干杯
标记
public sealed class SettingsFromDbManager
{
static readonly SettingsFromDbManager _instance = new SettingsFromDbManager();
SettingsFromDbManager()
{
try
{
Load();
}
catch (Exception ex)
{
throw ex; // BREAKPOINT HERE
}
}
public static SettingsFromDbManager Instance
{
get
{
return _instance;
}
}
.... more code ...
}
** 更新**
非常感谢所有伟大的建议和帮助!
皮埃尔我使用了你写的测试类。这是我调用它的代码。我猜这一定是 Compact Framework 的一个怪癖,因为当我检查异常时,它是 TypeLoadException,没有内部异常:(
try
{
Fail.Test();
}
catch (Exception ex)
{
var x = ex.ToString(); // BREAKPOINT HERE
}
我认为 VinayC 的原因可能是正确的。这一切都超出了我的认知。不知道现在该怎么办。我不想放弃我的 Singleton 课程——它们很有用。我正在使用来自http://csharpindepth.com/Articles/General/Singleton.aspx 的“第四版”单例模式。我以前没有使用过它们,但在应用程序周围共享一些实用程序类的相同实例而不是多次创建和处置它们似乎是个好主意。性能是 Compact Framework 的一个大问题。
* 更新 *
呜呼!我所要做的就是如下更改 Singleton 类。它在属性 getter 中实例化类。现在我的异常如预期般浮出水面:)
public sealed class SettingsFromDbManager
{
static SettingsFromDbManager _instance = null;
SettingsFromDbManager()
{
try
{
Load();
}
catch (Exception ex)
{
throw new Exception("Error loading settings", ex);
}
}
public static SettingsFromDbManager Instance
{
get
{
if (_instance == null)
_instance = new SettingsFromDbManager();
return _instance;
}
}
.... more code ...
}
【问题讨论】:
-
类的静态构造函数失败了,这很重要。这通常会生成 TypeInitializationException,对于 CF 可能会有所不同。 TypeLoadException 确实重叠。对我来说,这看起来像是一个 CF 怪癖。对于易碎资源,请避免使用这种模式。
-
将“throw ex”语句更改为“throw”。 'throw ex' 会重置堆栈跟踪,这可能会造成混乱。
-
感谢汉斯的评论。您对不那么“不稳定”的单例模式有什么想法吗?
-
感谢克里斯的提示。我不确定。但这并不能解决问题。
-
您的解决方案(根本不使用静态构造函数)确实是规避 CF 奇怪行为的方法。很高兴看到您找到了解决方法。
标签: c# windows-mobile exception-handling compact-framework error-handling