Отслеживание ошибки нулевой ссылки в приложении-службе Windows - что здесь происходит? - PullRequest
1 голос
/ 30 сентября 2011

Я делаю службу адаптера данных, и мне нужно сделать резервную копию уязвимых таблиц, прежде чем связываться с данными. Я использую вызов внешнего процесса «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;
    }

Я точно знаю, что ошибка генерируется в приведенном выше коде, потому что исключение заключено в сообщение вызывающим методом:

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);
        }

... И в журнале приложений появляется сообщение об упаковке:

Оперативное резервное копирование в резервном хранилище и резервное копирование i controller-laget: Ссылка на объект не установлена ​​для экземпляра объекта.

Я создаю его в Visual Studio 2010 на Windows 7 32-битной версии. Он был протестирован как локально, так и на веб-сервере Windows 2008 с тем же результатом. Я использую .net 4 Framework

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

вы перехватываете исключения очень неправильным образом, внутри блока catch, если вы действительно хотите создать новое исключение и выбросить его, не создавайте новое базовое исключение, а ApplicationException или другой производный класс из Exception и убедитесь, что вы передаете такому конструктору вызов фактического исключения из блока catch, например ex; Вы должны передать объект ex не только ex.Message, либо вы собираетесь скрыть реальное исключение и все его свойства, такие как callstack, внутреннее исключение и т. д.

0 голосов
/ 30 сентября 2011

Вероятно, объект indstillinger является нулевым, или некоторые из его внутренних вещей, и когда вы пытаетесь его использовать, он выбрасывает NullReferenceException.

Попробуйте запустить это в консольном приложении и пройтись по коду, и вы обнаружите ошибку.

Или, что еще лучше, взгляните на проект Topshelf и внедрите свою службу Windows, используя это.Это гораздо более приятный способ разработки Windows Services.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...