四、MapBasic程序的调试与运行
创建MapBasic应用程序后,还需要对它进行调试,修改程序中存在的错误。
1.编译错误与运行错误
程序错误可以分为两种类型:编译错误和运行错误。编译错误主要由语法错误和输入错误引起,它使程序无法成功编译。编译错误产生时,相应的错误信息指出了程序文件名和错误所在的行号。知道了发生错误的行号,可以返回MapBasic开发环境,选择[Search]>[Go To Line…]定位到引起问题的行,从而迅速地改正错误。运行错误是指用户在实际运行应用程序时产生的错误。引起这种错误的原因很多,如数据问题、算法问题等。例如下面的语句可以成功编译:
Open Table"states"
Map From state
但是如果没有一个名叫“state”的表,那么程序就会产生一个运行错误,MapInfo将中断MapBasic应用程序的执行,然后显示一个描述该错误的对话框。
2.调试MapBasic程序
调试程序一般是指发现并改正运行错误的过程。有些运行错误很容易纠正,例如那些由输入错误引起的,像上面的例子中,程序员原意可能是想输入表名“states”而不是“state”。但是另外一些错误却很难定位,为了帮助你检测和纠正程序中的错误,MapBasic提供了调试程序的工具(Stop和Continue语句)。
如果程序不能正确执行,可以按下面的步骤找出问题在哪里。
①在MapBasic开发环境中编辑程序,把Stop语句放在程序中可能有错误的那个部分的前面。
②重新编辑并运行程序。当程序执行到Stop语句,MapBasic暂时挂起正在执行的程序,在MapBasic窗口中显示一个调试信息(例如“Breakpoint at appinfo.mb line20”)。
③在MapBasic调试窗口中,可以使用下列方法对程序运行情况进行检查:
·输入?Dim,查看所有正在使用的局部变量列表;
·输入?Global,查看所有正在使用的全局变量列表;
·输入?Variable_name,查看某个变量的当前值;
·输入?Variable_name=new_value,改变变量的当前值。
④当检查或修改了变量的内容后,可以在MapBasic窗口输入Continue接着执行程序,也可以选择MapInfo的[File]>[Continue]来启动程序的重新执行。
在下列情况下,不能用Stop语句来挂起一个应用程序:
·在Function…End Function结构中不能使用Stop语句;
·在对话框控制处理程序中不能使用Stop语句;
·在一个进度条(ProgressBar)处理程序中不能使用stop语句;
·当另外一个应用程序正在运行时不能调试这个程序。
另外,MapBasic的“Note”和“Print”语句也可以作为调试应用程序的辅助工具。例如,如果想观察一个变量值的变化情况,可以在应用程序中加入如下的Print语句:
Print“Current value of counter:”+counter
这样即可以在MapBasic的信息窗口输出一条相应的信息。另外,MapBasic自带例程Appinfo.mbx可以帮助检查当前正在运行的MapBasic应用程序的全局变量值。
3.错误的捕获
一个设计良好的应用程序应该对可能出现的运行错误进行预测,一旦错误发生还能采取一些补救措施。对运行错误的窃听和处理就叫做错误的捕获。捕获错误可以使用OnError语句。
在程序执行的任何一个点上,错误捕获既可以被允许也可以不被允许。默认情况下,所有过程或函数是由错误捕获不允许开始的,其中用OnError语句可以使错误捕获被允许。典型的情况是,OnError语句总指向一个在同一个过程或函数中另一个位置的标号。标号后面的语句叫做错误捕获处理程序。一旦错误发生,就去执行该处理程序,而不是中止程序。
在错误捕获处理程序中,可以调用Err()函数获得一个整型的代码,它表明了该错误是属于哪一种类型。同样地,也可以使用Error$()函数返回一个描述错误信息的字符串。在程序的结束处使用Resume语句,告诉MapBasic在该处理程序执行结束时接着执行哪一行程序。下面的示例演示了如何进行错误捕获及相应处理。
OnError GoTo no_states Open Table"states"
OnError GoTo no_cities Open Table"cities"
Map From cities,states
after_mapfrom:
OnError GoTo 0
...
End Program
no_states:
Note"Could not open table States...no Map used."
Resume after_mapfrom
no_cities:
Note"City data not available…"
Map From states
Resume after_mapfrom
该程序的第一个语句是使得错误捕获被允许,并告诉MapBasic一旦错误发生就转去执行no_states后面的处理程序,处理程序的结尾是Resume after_mapfrom,作用是使处理程序结束后能返回到标号after_mapfrom处。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。