有时不支持Exists属性

时间:2019-04-25 20:51:22

标签: jscript testcomplete

我遇到了一个非常令人沮丧的错误,有时会出现该错误,并且有时会毫无问题地通过。我的代码是:

function killProcesses(processes) { // A string array of process names.
  for (i = 0; i < processes.length; i++) {
    var process = Sys.WaitProcess(processes[i])

    if (process.Exists) { // Sometimes the script will crash right here
      process.Terminate()
    }
}

自从我编写函数以来,我一直都传递完全相同的进程名称,有时它们是由其他名称启动的,这从来不是问题。但是有时它会在运行时崩溃并告诉我Object doesn't support this property or method。就像我说的那样,此函数和调用它的行从未更改,因此我不明白为什么只有有时它会失败。

我之前已经在脚本的其他部分中做到了这一点,所以我想知道它是否与之相关,或者我的系统普遍存在某些问题。真正令我感到困惑的是,Exists应该始终存在于所有事物上,为什么有时却不存在?

3 个答案:

答案 0 :(得分:2)

Sys.WaitProcess(ProcessName)方法应该返回找到的进程,或者返回一个空的存根对象,该对象仅具有属性Exists,值为false,如果未找到该进程。是否找到该进程无关紧要,可以使用Exists检查是否找到了该进程。

控制对象与Find方法的结果值存在相同的问题,并且对于从Find方法返回的所有对象都是普遍的问题。

我找到了一种解决方法:

如果在访问Name之前访问其他属性(例如Exists),则没有错误。

obj.Name; // Add this to prevent error in obj.Exists below:
if (obs.Exists)
{
    // Do something here
}

这仅在需要对象的情况下有效。以我为例。如果找不到预期的对象,则obj.Name将抛出一个正常的错误。

在预期找不到对象的情况下,如果Exists无效,则结果会卡住,因为结果值不为null或不为空,并且obj.Name会引发错误您想要避免的情况,唯一可以检查的条件是obj.Exists

但是,可能值得一试的是,如果找到了该进程,它是否对进程对象有效。

答案 1 :(得分:0)

也许您可以通过拥有

来保护null

如果(进程&&进程存在)

为了避免进程终止影响您的进程列表,我还会从顶部向下循环。

答案 2 :(得分:-1)

此代码的问题是,当您终止第一个进程时,其余进程的索引会减少。此版本的代码更好:

function killProcess(pName) {
  var p = Sys.WaitProcess(pName, 5000, 1);
  while (p.Exists) {
    p.Terminate();
    while (p.Exists)
      Sys.Delay(50);
    p = Sys.WaitProcess(pName, 5000, 1)
  }
}