刚刚做了程序,发现Delphi错误也不是那么好逮住然后进行处理的。一般情况下完全可以用Try --Except/Finally -- End块进行错误保护和处理。但是有些时候就不行了。想:
请教各位,如何完全的掌握住Delphi的错误,或者Delphi触发的系统错误?代码有点多,小弟实在是撑不住了所以请教各位,先谢了
具体问题:
在Project里,有如下代码片段:
-----------------------------------------------------------------------------------------
{(1)} Application.CreateForm(Tfrm_Main, frm_Main); {创建窗体并初始化(里面包括各个自己的对象的创建及初始化,读取配置文件(*.ini)中的数据,进行数据库的连接及测试等)}{(2)} Application.Run(); {就是这行发生错误。因为初始化未成功/通过(人为删除了配置文件),所以在窗体frm_Main里直接Self.Close()了}
-----------------------------------------------------------------------------------------不知道是什么原因导致了错误。F8进行单步调试,就错在(2)上(错误提示:Project Project.exe raised exception class EAccessViolation with message 'Access violation at address 004C2D1A in module 'Project.exe'.Read of address 00000034'.)。当没有配置文件时,发生此错误。
注释:frm_Main里有文件是否存在的检测代码(经测试有效)。当无配置文件时,初始化函数进行Application.Message提示后返回False,frm_Main.FormCreate()中检测到返回False后直接Self.Close()或者Appication.Terminate()。
另:在代码中希望结束程序时,调用主窗体的Close()和Appication的Terminate()有什么区别?另外,当连接数据库时(Access2000),无ODBC时,Try块无法将错误保护。ODBC中无数据库密码时也是。如何解决,如何完全的将错误进行保护(不出现系统提示)?

解决方案 »

  1.   

    笨人想法:
    建议楼主试试这个:windows.GetLastError;返回值为Cardinal(整型)。
      

  2.   

    看看MainForm的Close中是否有释放还没有创建的对象的代码.
    建议不要在MainForm的Create中检测,检测不通过就退出.
    你可以在Application.CreateForm(Tfrm_Main, frm_Main); 之前放调用一个函数来检测.检测的结果放在一个全局对象中.
    这样做的好处是,防止检测不通过,退出时,主窗体仍然闪现.
      

  3.   

    呵呵,不好意思。
    为了方便集中管理,我做了个退出程序的函数做些其他的工作,调用它就可以退出程序(form.Close()或者Application.Terminate())。不知道是不是这个的原因。因为只要主窗体建立了,就可以在任何地方,时间调用它。所以不是很好调试。但是用起来方便啊