2
votes

Parfois, la propriété Exists n'est pas prise en charge

Je reçois une erreur vraiment frustrante qui survient parfois et parfois elle se déroule sans problème. Mon code est:

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()
    }
}

Depuis que j'ai créé la fonction, j'ai toujours passé exactement les mêmes noms de processus, parfois ils sont démarrés d'autres non, cela n'a jamais été un problème. Mais d'autres fois, il plantera lors de l'exécution et me dira que Object ne prend pas en charge cette propriété ou méthode . Comme je l'ai dit, cette fonction et la ligne qui l'appelle n'ont jamais été modifiées, donc je ne comprends pas pourquoi cela échoue parfois.

J'ai déjà eu cela dans d'autres parties de mes scripts, donc Je me demande si cela pourrait être lié ou s'il y a simplement quelque chose qui ne va pas dans mon système. Ce qui me déroute vraiment, c'est que Exists devrait toujours exister sur tout, alors pourquoi n'est-il parfois pas là?


0 commentaires

3 Réponses :


-1
votes

Le problème avec ce code est que lorsque vous terminez le premier processus, les index des autres processus sont réduits. Cette version du code est meilleure:

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)
  }
}


1 commentaires

Cela ne répond pas à la question de savoir pourquoi .Exists plante mon script. Si je devais utiliser votre suggestion, il planterait toujours au hasard quand il atteindrait cette ligne.



2
votes

La méthode Sys.WaitProcess (ProcessName) doit renvoyer le processus trouvé ou un objet stub vide avec uniquement la propriété Exists avec une valeur false code > si le processus n'est pas trouvé. Peu importe si le processus est trouvé, il devrait être correct d'utiliser Exists pour vérifier si le processus est trouvé.

J'ai le même problème avec les objets de contrôle que la valeur de résultat de Find

et elle est répandue pour tous les objets renvoyés par la méthode Find .

J'ai trouvé une solution de contournement:

Si vous accédez à une propriété différente (par exemple Name ) avant d'accéder à Exists , il n'y a pas d'erreur.

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

Cela ne fonctionne que si les objets sont attendus. Dans mon cas, ils le sont. Si l'objet attendu n'est pas trouvé, obj.Name lancera une erreur qui est ok comme prévu.

Dans le cas où l'objet peut ne pas être trouvé, vous serait bloqué si Exists ne fonctionne pas car la valeur du résultat n'est pas nulle ou non vide et obj.Name lancera une erreur que vous voulez éviter et la seule condition que vous peut vérifier est obj.Exists.

Cependant, il peut être utile d'essayer de voir si cela fonctionne pour l'objet de processus si le processus est trouvé.


1 commentaires

Merci RobC d'avoir créé les noms des méthodes et des propriétés dans des formats de code. C'est mon premier article et j'ai besoin d'apprendre à utiliser les formats de code.



0
votes

Peut-être que vous pourriez protéger pour null en ayant

Si (processus && processus.Existe)

Je ferais également une boucle depuis le haut juste au cas où l'arrêt du processus affecterait votre liste de processus.


0 commentaires