我正在使用CompactFramework3.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的一个怪癖,因为当我检查异常时,它是TypeLoadException,没有任何内部异常:(
try
{
Fail.Test();
}
catch (Exception ex)
{
var x = ex.ToString(); // BREAKPOINT HERE
}我认为VinayC的理由可能是正确的。这都是我所不知道的。不知道现在该怎么做。我不想放弃我的单身课程--它们是有用的。我正在使用来自http://csharpindepth.com/Articles/General/Singleton.aspx的“第四个版本”单例模式。我以前没有使用过它们,但是似乎应该在应用程序周围共享一些实用程序类的相同实例,而不是多次创建和处理它们。在Compact中,性能是一个大问题。
*更新*
喔呼!我所要做的就是更改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 ...
}发布于 2010-10-05 04:17:20
据我所知,静态构造函数可能运行在不同的线程(或者更具体地说是在不同的调用链上)--这是运行时的一个保证,即在访问类型之前将调用它们。静态构造函数中的异常将标记为对应用程序域不可用的类型。当类型被访问时,您将得到一个TypeInitializationException (如文档所示),但是类型构造函数中发生的异常不会以内部异常的形式出现,因为它不在同一个调用链上--因此,静态构造函数可能以前就已经执行过了。正如汉斯所指出的,这里唯一的谜团是TypeLoadException而不是TypeIntializationException。
编辑:下面是解释类型初始化器的懒惰/急切语义的文章。您的代码可以是迫切的实现(即静态构造函数甚至可以在第一次访问类型字段之前被调用)
发布于 2010-10-05 04:17:16
在静态构造函数中引发的异常不会出现在原始调用位置中,这是没有充分理由的。但是,我不明白为什么不使用System.TypeInitializationException,这应该是在静态构造函数失败时抛出的异常。
下面是一段示例代码,它将System.TypeInitializationException的内部异常设置为"failed"异常:
class Fail
{
static Fail()
{
}
Fail()
{
throw new System.Exception ("failed");
}
static readonly Fail instance = new Fail ();
public static void Test()
{
}
}我将进一步研究为什么要获得TypeLoadException,这应该发生在程序集无法正确加载或初始化时(TypeLoadException类在MSDN中)。
https://stackoverflow.com/questions/3860690
复制相似问题