0

在问题上方的帖子中有一个 TL;DR 版本。我有一个程序引用了一个我无法管理的外部程序集。它基本上管理与 Card PinPad 读卡器的连接,并组织从所述卡中读取的信息。有一些简单的代码:

    Try
        pinpad.readcard(lecturaEntrada, lecturaSalida)
    Catch ex As Exception
        MsgBox("Failed Card read " & ex.Message)
        Exit Sub
    End Try

这里发生的是 Pinpad 等待卡片读取,用户可以通过单击设备上的取消来取消它。抛出异常,ex.message 为“用户已取消”。我很确定这是一个创建/管理的异常,因为它不是真正的系统异常。因此,我可以在每次需要时以 100% 的速率重现错误/异常。

我用它做了几次测试,每次它抛出异常。之后,我将其导出到生产/测试电脑。只是注意到它不再起作用了。经过大量修改后,我发现在 VStudio 调试运行时运行程序,try catch 可以完美运行。每当我使用可执行文件时,无论是在目标 PC 上还是在我自己的 DEV PC 上,可执行文件 try catch 都会出错,并且不会捕获任何内容,只会使程序崩溃。

TLDR:程序有一个 try catch 例程。它在 VS2010 调试运行时中运行良好,并且在您使用 .exe 时不起作用

为了让它工作,我能做些什么吗?在创建可执行文件的过程中,是否有一些我不知道的幕后发生的事情正在消除程序尝试捕获的能力?

编辑:我尝试关闭优化,以管理员身份运行,但无济于事。谷歌也没有提出任何答案

编辑:继承堆栈跟踪是:

en Banorte.NET.procearExcepcion(APIException* e)
en Banorte.PinPan.PinPadVerifone.leertarjeta(hashtable parametrosEntrada, hashtable parametrosSalida)
en PruebasPinPad.form.btnPagoTDC_click(objectsender,eventargs e) en C:\VS2010\PruebasPinPad\Form.vb:linea191

也没有内部异常

编辑:当我尝试直接调试 .exe 时,我发现了这个堆栈跟踪:

System.AccessViolationException was unhandled
  Message=Intento de leer o escribir en la memoria protegida. A menudo, esto indica que hay otra memoria dañada.
  Source=BanortePinPad
  StackTrace:
       en std.basic_string<char,std::char_traits<char>,std::allocator<char> >.{dtor}(basic_string<char\,std::char_traits<char>\,std::allocator<char> >* )
       en APIException.{dtor}(APIException* )
       en ___CxxCallUnwindDtor(IntPtr pDtor, Void* pThis)
       en leerTarjetaEx(map<std::basic_string<char\,std::char_traits<char>\,std::allocator<char> >\,std::basic_string<char\,std::char_traits<char>\,std::allocator<char> >\,std::less<std::basic_string<char\,std::char_traits<char>\,std::allocator<char> > >\,std::allocator<std::pair<std::basic_string<char\,std::char_traits<char>\,std::allocator<char> > const \,std::basic_string<char\,std::char_traits<char>\,std::allocator<char> > > > >* mapaParametrosEntrada, map<std::basic_string<char\,std::char_traits<char>\,std::allocator<char> >\,std::basic_string<char\,std::char_traits<char>\,std::allocator<char> >\,std::less<std::basic_string<char\,std::char_traits<char>\,std::allocator<char> > >\,std::allocator<std::pair<std::basic_string<char\,std::char_traits<char>\,std::allocator<char> > const \,std::basic_string<char\,std::char_traits<char>\,std::allocator<char> > > > >* mapaParametrosSalida)
       en Banorte.PinPad.PinPadVerifone.leerTarjeta(Hashtable parametrosEntrada, Hashtable parametrosSalida)
       en PruebasPinPAD.Form.btnPagoTDC_Click(Object sender, EventArgs e) en C:\VS2010\PruebasPinPAD\Form.vb:línea 191
       en System.Windows.Forms.Control.OnClick(EventArgs e)
       en System.Windows.Forms.Button.OnClick(EventArgs e)
       en System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       en System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       en System.Windows.Forms.Control.WndProc(Message& m)
       en System.Windows.Forms.ButtonBase.WndProc(Message& m)
       en System.Windows.Forms.Button.WndProc(Message& m)
       en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       en System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       en System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       en System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       en System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       en System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       en Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       en Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       en Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       en PruebasPinPAD.My.MyApplication.Main(String[] Args) en 17d14f5c-a337-4978-8281-53493378c1071.vb:línea 81

继承人并编辑以使我的问题有所提高。在此先感谢您提供的任何帮助,并感谢迄今为止尝试提供帮助的任何人。我仍在努力解决这个问题。

编辑:我刚刚看到调试 exe 的错误,它读取。AccessViolationException 未处理。并且无法在受保护的内存中读/写。

4

1 回答 1

0

在我看来,您正在处理不符合 CLS 的异常。

要捕获任何不符合 CLS 的异常,您需要有一个空捕获:

try { }
catch { }

在 VB 中:

Try
Catch
End Try

所以你的代码应该是这样的:

Try
    pinpad.readcard(lecturaEntrada, lecturaSalida)
Catch
   MsgBox("Failed Card read")
   Exit Sub
End Try
于 2013-09-11T21:31:44.940 回答