我正在制作数据适配器服务,我需要在弄乱数据之前备份受影响的表。我正在使用调用外部进程“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ørelsenafbackup i controller-laget:对象引用未设置为对象的实例。
我正在Windows 7 32位的Visual Studio 2010中构建它。它已在本地和Windows 2008 Web服务器上进行了测试,结果相同。我正在使用.net 4框架
答案 0 :(得分:1)
你是以非常错误的方式捕获异常,如果你真的想创建一个新的异常并抛出它,不要创建一个新的基类Exception而是ApplicationException
或其他派生类来自Exception
,并确保传递给这样的构造函数调用catch块的实际异常,如ex
;你不仅要传递ex.Message的ex对象,要么隐藏真正的异常及其所有属性,如callstack,内部异常等......
答案 1 :(得分:0)
对象indstillinger
可能是null或其内部事物,当您尝试使用它时,它会抛出NullReferenceException
。
尝试在控制台应用程序中运行它并逐步执行代码,您将发现错误。
或者甚至更好,看看Topshelf project并使用它来实现您的Windows服务。这是开发Windows服务的一种更愉快的方式。