跟踪Windows服务应用程序中的空引用错误 - 这是什么?

时间:2011-09-30 11:30:05

标签: .net exception service

我正在制作数据适配器服务,我需要在弄乱数据之前备份受影响的表。我正在使用调用外部进程“mysqldump.exe”,一切从命令行运行正常 - 但是服务在启动备份时会抛出空引用错误。

正如您在代码中看到的那样,我已经非常努力地确定错误发生的位置(异常被捕获并写入我的控制器层中的Windows应用程序日志),但是我的异常没有被抛出,所以我最终不会更聪明。

我们走了:

public static string Backup(string host, string database, string dbUser, string dbPwd, string[] tables, string OutputFile, out bool succes, string fileRoot)
    {
        Process myProcess = new Process();
        int debug = 0;
        try
        {
            myProcess.StartInfo.FileName = fileRoot + "Backup\\mysqldump.exe";
            debug++;
            myProcess.StartInfo.UseShellExecute = false;
            debug++;
            myProcess.StartInfo.CreateNoWindow = true;
            debug++;
            myProcess.StartInfo.RedirectStandardOutput = true;
            debug++;
            myProcess.StartInfo.RedirectStandardError = true;
            debug++;
            succes = false;
        }
        catch
        {
            throw new Exception("BackupMetoden blev afbrud ved en fejl under instantieringen af mysqldump.exe\r\n\r\nDebug niveau: " + debug);
        }
        //Rediger Arguments
        debug = 0;
        string output = "";
        try
        {
            string args = "-h " + host + " " + database + "  --tables #TABELLER#" + "--user=" + dbUser + " --password=" + dbPwd + " --result-file " + OutputFile;
            debug++;
            string tabeller = "";
            debug++;
            foreach (string t in tables)
            { tabeller += t + " "; }
            debug++;
            args = args.Replace("#TABELLER#", tabeller);
            debug++;
            myProcess.StartInfo.Arguments = args;
            debug++;
            output = "Ingen backup udført - der er sket en fejl";
        }
        catch(Exception ex)
        {
            throw new Exception("BackupMetoden blev afbrud ved en fejl under samling af kommando-syntaks\r\n" + ex.Message + "\r\nDebug niveau: " + debug);
        }

        try
        {
            myProcess.Start();
            output = myProcess.StandardError.ReadToEnd();
            succes = true;
        }
        catch(Exception ex)
        {
            succes = false;
            throw new Exception("Der opstod en fejl under backup: " + output + "\r\n" + ex.Message + "\r\n\r\n" + ex.StackTrace);
        }
        return output;
    }

我确定在上面的代码中抛出了错误,因为Exception被调用方法包装在消息中:

try
        {
            resultat = VDB_MysqlBackupRestore.Backup(indstillinger.Host(kilde), indstillinger.DB(kilde), indstillinger.User(kilde), indstillinger.Pass(kilde), tables, outputFile, out succes, rodmappe);
            return resultat;
        }
catch (Exception backupfejl)
        {
            throw new Exception("Der opstod fejl under uførelsen af backup i controller-laget: " + backupfejl.Message);
        }

...包装消息显示在应用程序日志中,如下所示:

在opfod fejl下uføre​​lsenafbackup i controller-laget:对象引用未设置为对象的实例。

我正在Windows 7 32位的Visual Studio 2010中构建它。它已在本地和Windows 2008 Web服务器上进行了测试,结果相同。我正在使用.net 4框架

2 个答案:

答案 0 :(得分:1)

你是以非常错误的方式捕获异常,如果你真的想创建一个新的异常并抛出它,不要创建一个新的基类Exception而是ApplicationException或其他派生类来自Exception,并确保传递给这样的构造函数调用catch块的实际异常,如ex;你不仅要传递ex.Message的ex对象,要么隐藏真正的异常及其所有属性,如callstack,内部异常等......

答案 1 :(得分:0)

对象indstillinger可能是null或其内部事物,当您尝试使用它时,它会抛出NullReferenceException

尝试在控制台应用程序中运行它并逐步执行代码,您将发现错误。

或者甚至更好,看看Topshelf project并使用它来实现您的Windows服务。这是开发Windows服务的一种更愉快的方式。