System.TypeInitializationException未处理

3
当MS Visual Studio 2005抛出此消息时,这意味着什么?
"The type initializer for 'RMDC.clsVariables' threw an exception."

错误日志如下:

System.TypeInitializationException was unhandled
  Message="The type initializer for 'RMDC.clsVariables' threw an exception."
  Source="RMDC"
  TypeName="RMDC.clsVariables"
  StackTrace:
       at RMDC.clsFunctions.getRegistryValue() in D:\Magnus Project\Project Backup\RMDC\RMDC\Class\clsFunctions.cs:line 704
       at RMDC.Program.Main() in ..\RMDC\RMDC\Program.cs:line 39
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()

存在错误的类

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;
using System.Collections;


namespace RMDC
{
    class clsVariables
    {
        public SqlConnection conn = new SqlConnection();

        public SqlDataAdapter sAdapter = new SqlDataAdapter();
        public DataSet sDataSet = new DataSet();

        public static string sMessageBox = "";
        public static string sUsername;
        public static string sUserFullname;
        public static string sUserLogin;
        public static string sUserType;
        public static int sUserID;
        public static string sServer = "system-10";
        public static string sDatabase = "";
        public static string sDBUserID = "";
        public static string sDBPassword = "";
        public static bool sDontShow = false;
        public static string sCompanyName;
        public static string sContactName;
        public static string sCompanyAddress;
        public static string sPhoneNumber;
        public static string sFaxNumber;
        public static string sEmailAddress;
        public static string sWebAddress;
        public static string sOfficeCd = "01";
        public static int sfiscalYrId = 1;
        public static string sfiscalYr;
        public static DateTime sFiscalStart = DateTime.Today;
        public static DateTime sFiscalEnd = DateTime.Today;
        public static int sRoleId;

        public static byte[] m_barrImg;

        public static SqlConnection cnn = new SqlConnection();

        public OpenFileDialog openIMG = new OpenFileDialog();

        public static NepEngCalanderProvider.NepEngDateClass nepDate = new NepEngCalanderProvider.NepEngDateClass();
        public static NumberToWord.InWordsClass NumericWords = new NumberToWord.InWordsClass();


        public enum QueryType
        {
            Insert,
            Update,
            Delete
        }
    }
}

堆栈跟踪的前两行给出了文件和行号以便调查。从那里开始。 - Quick Joe Smith
1
@Quick Joe Smith:实际上可能并不是这样。他们可能只是展示了调用导致类型初始化的方法。原帖作者应该查看实际的类型初始化器。 - Jon Skeet
这可能是情况,但在发布问题之前,您建议别人在哪里开始查找? - Quick Joe Smith
2个回答

3

好的,这段文字的意思是:它的意思就是——RMDC.clsVariables的类型初始化程序中出现了问题(顺便说一句,这个名字很不寻常)。

这可能是一个静态变量初始化程序:

static int foo = GetInitialValueForFoo();

或者是静态构造函数:

static clsVariables
{
    DoSomething();
}

无论是什么,它都失败了,导致你的类型无法使用。
如果在调试器中运行代码,它应该会在异常被抛出时中断,这样更容易弄清楚发生了什么。

@Rabin:没有看到任何代码,很难说。发布静态初始化程序和静态构造函数,这可能会给出一些提示。请注意,它将运行所有静态初始化程序,而不仅仅是您的方法需要使用的那个。 - Jon Skeet
2
@Rabin:这是太多的静态变量了,其中大部分看起来本来就不应该是静态的。还有一个SqlConnection实例变量和一个相同类型的静态变量?恶心。我建议先进行重构。我的猜测是NepEngCalanderProvider.NepEngDateClass或NumberToWord.InWordsClass引起了问题,但很难说。你试过在调试器中运行吗? - Jon Skeet
是的。我尝试了调试器。我将尝试删除并添加这两个dll文件,看看是否可以再次运行它。关于静态变量,我不知道是谁做的。但是确实有很多这样的变量存在 :) - Rabin
@Rabin:当你在调试器中尝试时发生了什么?它没有在遇到错误时进入调试器吗?请注意,TypeInitializerException的InnerException应该说明实际出了什么问题。 - Jon Skeet
@Rabin 我无法为此点赞足够多。我也遇到了TypeInitializationException,但它来自于一个服务的程序static Main()函数(这些函数不容易调试),我无法正确地在Main()周围附加try/catch以获取我的记录器告诉我堆栈跟踪。然而,Rabin,你更新DLL的想法提醒我自己也需要进行一些更新。那就解决了!谢谢! - seebiscuit
显示剩余3条评论

3

要找出导致TypeInitializationException引发的原因,您需要查看异常的InnerException。如果没有这些信息,就无法猜测出问题所在。

无论是哪种代码生成了错误日志,都需要进行一些修改,以便不会忘记显示内部异常。如果使用Exception.ToString()方法,则自动完成此操作。必要时,请实现AppDomain.CurrentDomain.UnhandledException的事件处理程序,并记录e.ExceptionObject.ToString()的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接