C# 处理错误PinvokesTack
我想根据打印方法的结果更改复选框的状态。如果打印机未连接或找不到,我将处理它。现在,如果找不到打印机,即打印机未连接,我的代码将抛出一个C# 处理错误PinvokesTack,c#,C#,我想根据打印方法的结果更改复选框的状态。如果打印机未连接或找不到,我将处理它。现在,如果找不到打印机,即打印机未连接,我的代码将抛出一个pinvokestack不平衡发生,如果我按continue,它不会转到我的catch(Exception ex)子句。我想处理这个错误,要么是为了获取catch子句,要么就是为了捕获这个pinvokestackdisplay消息。下面是我的代码 private void btnPrint_Click(object sender, EventArgs e)
pinvokestack不平衡发生
,如果我按continue,它不会转到我的catch(Exception ex)子句。我想处理这个错误,要么是为了获取catch子句,要么就是为了捕获这个pinvokestackdisplay
消息。下面是我的代码
private void btnPrint_Click(object sender, EventArgs e)
{
if (txtPrinterName.Text == string.Empty)
{
MessageBox.Show("Enter a printer name");
return;
}
try
{
var mstrFullCutCode = (char)27 + (char)109;
_finalLength = noteToPrint;
var printingObject = new PrintClass.Class1.RawPrinterHelper();
var result = PrintClass.Class1.RawPrinterHelper.SendStringToPrinter(txtPrinterName.Text, _finalLength + mstrFullCutCode);
frmMain.Instance.LblStatus.Text = "Printer is found: " + result;
if ((bool)result)
{
frmMain.Instance.CbPrinter.Checked = true;
}
}catch(Exception ex)
{
frmMain.Instance.LblStatus.Text = "Error: " + ex.Message;
}
}
这是托管调试助手的图像
…如果我按continue,它不会转到catch(Exception ex)子句。我想处理这个错误,或者转到catch子句,或者只是捕获这个pinvokestack消息
我想你做不到
虽然MDA看起来像一个未处理的异常,但它不是。例如,请参见本页上的第一个注释,其中部分说明了这一点(添加了重点)
如果在调试器不存在时引发MDA事件,则事件消息将显示在未处理的异常对话框中,,尽管它不是未处理的异常
Apinvokestack
托管调试助手(MDA)。因此,它通常表示PInvoke使用的托管签名中存在错误,而不是缺少打印机
您应该检查您正在使用的本机方法的声明-很可能是OpenPrinter
如果使用RawPrinterHelper
类,请注意SendBytesToPrinter
返回true
或false
以指示成功或失败,但SendStringToPrinter
忽略该返回值并始终返回true
SendStringToPrinter
函数实际上应该返回SendBytesToPrinter
的结果,您的代码应该检查该返回值并调用以获取有关故障的更多信息。您应该得到一个1801错误代码-打印机名称无效。这不是一个例外。MDA(托管调试助手)是添加到CLR中的额外工具,用于告诉调试器发生了非常糟糕的事情。这是一种令人讨厌的情况,当这种情况发生时,程序员会丢失大量的头发,而且没有诊断方法。堆栈不平衡非常适合这个讨厌的问题,它不会自动导致程序崩溃。只有当您对代码或构建设置做出看似无辜的更改时,才是最糟糕的错误诊断。“处理”它的唯一方法是修复bug,但它可能不是您编写的代码。扔掉,谢谢你,弗兰克·博因。它把我带到某个地方。