Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理错误PinvokesTack_C# - Fatal编程技术网

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事件,则事件消息将显示在未处理的异常对话框中,,尽管它不是未处理的异常

A
pinvokestack
托管调试助手(MDA)。因此,它通常表示PInvoke使用的托管签名中存在错误,而不是缺少打印机

您应该检查您正在使用的本机方法的声明-很可能是
OpenPrinter

如果使用
RawPrinterHelper
类,请注意
SendBytesToPrinter
返回
true
false
以指示成功或失败,但
SendStringToPrinter
忽略该返回值并始终返回
true


SendStringToPrinter
函数实际上应该返回
SendBytesToPrinter
的结果,您的代码应该检查该返回值并调用以获取有关故障的更多信息。您应该得到一个1801错误代码-打印机名称无效。

这不是一个例外。MDA(托管调试助手)是添加到CLR中的额外工具,用于告诉调试器发生了非常糟糕的事情。这是一种令人讨厌的情况,当这种情况发生时,程序员会丢失大量的头发,而且没有诊断方法。堆栈不平衡非常适合这个讨厌的问题,它不会自动导致程序崩溃。只有当您对代码或构建设置做出看似无辜的更改时,才是最糟糕的错误诊断。“处理”它的唯一方法是修复bug,但它可能不是您编写的代码。扔掉,谢谢你,弗兰克·博因。它把我带到某个地方。