Try / Catch在调试中运行良好,但在.exe中运行不正常

时间:2013-09-11 15:57:47

标签: vb.net debugging try-catch release exe

有一个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调试运行时运行该程序,尝试catch工作完美。每当我使用可执行文件时,无论是在目标PC上还是在我自己的DEV PC上,可执行文件try catch都是错误的,并且没有捕获任何内容,只会导致程序崩溃。

TLDR:程序有一个try catch例程。它在VS2010调试运行时内工作正常,并且在使用.exe

时不起作用

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

编辑:我试过关闭优化,以管理员身份运行,但无济于事。谷歌没有抛出任何asnwers

编辑:继承堆栈跟踪:

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未处理。并且无法在受保护的存储器中读/写。

1 个答案:

答案 0 :(得分:0)

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

要捕获任何非CLS兼容的异常,您需要有一个空的catch:

try { }
catch { }

在VB中:

Try
Catch
End Try

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

Try
    pinpad.readcard(lecturaEntrada, lecturaSalida)
Catch
   MsgBox("Failed Card read")
   Exit Sub
End Try