Comprendre try..catch in Javascript

J'ai ce problème de tentative et de capture. J'essaie de rediriger vers une autre page. Mais parfois il le fait et parfois il ne le fait pas. Je pense que le problème est d'essayer de prendre. Quelqu'un peut-il m'aider à comprendre cela. Merci

var pg = new Object(); var da = document.all; var wo = window.opener; pg.changeHideReasonID = function(){ if(pg.hideReasonID.value == 0 && pg.hideReasonID.selectedIndex > 0){ pg.otherReason.style.backgroundColor = "ffffff"; pg.otherReason.disabled = 0; pg.otherReason.focus(); } else { pg.otherReason.style.backgroundColor = "f5f5f5"; pg.otherReason.disabled = 1; } } pg.exit = function(pid){ try { if(window.opener.hideRecordReload){ window.opener.hideRecordReload(pg.recordID, pg.recordTypeID); } else { window.opener.pg.hideRecord(pg.recordID, pg.recordTypeID); } } catch(e) {} try { window.opener.pg.hideEncounter(pg.recordID); } catch(e) {} try { window.opener.pg.hideRecordResponse(pg.hideReasonID.value == 0 ? pg.otherReason.value : pg.hideReasonID.options[pg.hideReasonID.selectedIndex].text); } catch(e) {} try { window.opener.pg.hideRecord_Response(pg.recordID, pg.recordTypeID); } catch(e) {} try { window.opener.pg.hideRecord_Response(pg.recordID, pg.recordTypeID); } catch(e) {} try { window.opener.window.parent.frames[1].pg.loadQualityMeasureRequest(); } catch(e) {} try { window.opener.pg.closeWindow(); } catch(e) {} parent.loadCenter2({reportName:'redirectedpage',patientID:pid}); parent.$.fancybox.close(); } pg.hideRecord = function(){ var pid = this.pid; pg.otherReason.value = pg.otherReason.value.trim(); if(pg.hideReasonID.selectedIndex == 0){ alert("You have not indicated your reason for hiding this record."); pg.hideReasonID.focus(); } else if(pg.hideReasonID.value == 0 && pg.hideReasonID.selectedIndex > 0 && pg.otherReason.value.length < 2){ alert("You have indicated that you wish to enter a reason\nnot on the list, but you have not entered a reason."); pg.otherReason.focus(); } else { pg.workin(1); var n = new Object(); n.noheaders = 1; n.recordID = pg.recordID; n.recordType = pg.recordType; n.recordTypeID = pg.recordTypeID; n.encounterID = request.encounterID; n.hideReasonID = pg.hideReasonID.value; n.hideReason = pg.hideReasonID.value == 0 ? pg.otherReason.value : pg.hideReasonID.options[pg.hideReasonID.selectedIndex].text; Connect.Ajax.Post("/emr/hideRecord/act_hideRecord.php", n, pg.exit(pid)); } } pg.init = function(){ pg.blocker = da.blocker; pg.hourglass = da.hourglass; pg.content = da.pageContent; pg.recordType = da.recordType.value; pg.recordID = parseInt(da.recordID.value); pg.recordTypeID = parseInt(da.recordTypeID.value); pg.information = da.information; pg.hideReasonID = da.hideReasonID; pg.hideReasonID.onchange = pg.changeHideReasonID; pg.hideReasonID.tabIndex = 1; pg.otherReason = da.otherReason; pg.otherReason.tabIndex = 2; pg.otherReason.onblur = function(){ this.value = this.value.trim(); } pg.otherReason.onfocus = function(){ this.select(); } pg.btnCancel = da.btnCancel; pg.btnCancel.tabIndex = 4; pg.btnCancel.title = "Close this window"; pg.btnCancel.onclick = function(){ //window.close(); parent.$.fancybox.close(); } pg.btnHide = da.btnHide; pg.btnHide.tabIndex = 3; pg.btnHide.onclick = pg.hideRecord; pg.btnHide.title = "Hide " + pg.recordType.toLowerCase() + " record"; document.body.onselectstart = function(){ if(event.srcElement.tagName.search(/INPUT|TEXT/i)){ return false; } } pg.workin(0); } pg.workin = function(){ var n = arguments.length ? arguments[0] : 1; pg.content.disabled = pg.hideReasonID.disabled = n; pg.blocker.style.display = pg.hourglass.style.display = n ? "block" : "none"; if(n){ pg.otherReason.disabled = 1; pg.otherReason.style.backgroundColor = "f5f5f5"; } else { pg.otherReason.disabled = !(pg.hideReasonID.value == 0 && pg.hideReasonID.selectedIndex > 0); pg.otherReason.style.backgroundColor = pg.otherReason.disabled ? "f5f5f5" : "ffffff"; pg.hideReasonID.focus(); } } 

Je pense que votre problème principal est que vous aviez des exceptions, ce qui est très mauvais . C'est pourquoi "ça marche parfois". Quelque chose lance une exception, et vous l'attrapez, mais vous ne faites rien d'autre après cela. À tout le moins, j'aimerais afficher une sorte de message d'erreur dans votre bloc catch .

Quelques autres problèmes:

  • Êtes-vous certain que vous avez besoin de ces blocs de try..catch ? L'hypothèse actuelle dans votre code est que chaque ligne qui est enveloppée dans une try..catch est indépendante des autres et l'exécution peut encore se try..catch si quelque chose ne va pas dans une ou plusieurs de ces déclarations. Êtes-vous sûr que c'est ce que vous voulez? Si c'est le cas, il y a certainement une meilleure façon de gérer cela.
  • Si les déclarations ne sont pas indépendantes l'une de l'autre et si une défaillance à n'importe quel point signifie que l'exécution ne peut pas se dérouler, vous pouvez envelopper toutes ces instructions dans un seul bloc try..catch et afficher un message d'erreur dans la catch
  • Comme je l'ai déjà dit, les exceptions sont très mauvaises ! Vous cachez le problème et n'atteignez rien. Cela rend également le débogage extrêmement difficile, car les choses vont cesser de fonctionner et vous ne saurez pas pourquoi (pas d'exception, pas de journalisation, pas de messages d'erreur). Les exceptions sont utilisées lorsque survient quelque chose d'inattendu qui interrompt le flux de programme normal. C'est quelque chose que vous voulez vraiment gérer.

Je pense que ce que vous voulez peut être fait de cette façon:

 try { if(window.opener.hideRecordReload){ window.opener.hideRecordReload(pg.recordID, pg.recordTypeID); } else { window.opener.pg.hideRecord(pg.recordID, pg.recordTypeID); } window.opener.pg.hideEncounter(pg.recordID); window.opener.pg.hideRecordResponse(pg.hideReasonID.value == 0 ? pg.otherReason.value : pg.hideReasonID.options[pg.hideReasonID.selectedIndex].text); window.opener.pg.hideRecord_Response(pg.recordID, pg.recordTypeID); window.opener.pg.hideRecord_Response(pg.recordID, pg.recordTypeID); window.opener.window.parent.frames[1].pg.loadQualityMeasureRequest(); window.opener.pg.closeWindow(); } catch(e) { console.log(e); } 

De cette façon, si une exception se produit n'importe où le long de ces séries d'instructions, le bloc catch le gérera.

Javascript n'a pas non plus de véritables exceptions contrôlées. Vous pouvez le contourner en ayant un seul bloc d'essai et en inspectant l'objet d'exception que vous recevez * .

En développant ce dont j'ai déjà parlé, il existe deux façons de gérer les exceptions. La première façon, comme je l'ai montré précédemment, suppose que lorsqu'une exception se produit, le code est dans un état non valide et non défini, ce qui signifie que le code a rencontré une erreur irrécupérable. Une autre façon de gérer les exceptions est si vous savez que c'est quelque chose que vous pouvez récupérer. Vous pouvez le faire avec un drapeau. Alors:

 try { doSomething(); } catch(e) { error = true; } if(error) { doStuffToRecoverFromError(); } else { doOtherStuff(); } 

Dans ce cas, le flux de votre logique dépend d'une exception rejetée. L'important est que l'exception est récupérable, et selon qu'il a été lancé ou non, vous faites différentes choses.

* Voici un exemple quelque peu imaginé qui démontre les exceptions vérifiées. J'ai deux exceptions appelées VeryBadException et ReallyBadException qui peuvent être jetées (au hasard) à partir de deux fonctions. Le bloc de catch gère l'exception et détermine quel type d'exception il est en utilisant l' instanceof opérateur):

 function VeryBadException(message) { this.message = message; } function ReallyBadException(message) { this.message = message; } function foo() { var r = Math.floor(Math.random() * 4); if(r == 2) { throw new VeryBadException("Something very bad happened!"); } } function bar() { var r = Math.floor(Math.random() * 4); if(r == 1) { throw new ReallyBadException("Something REALLY bad happened!"); } } try { foo(); bar(); } catch(e) { if(e instanceof VeryBadException) { console.log(e.message); } else if(e instanceof ReallyBadException) { console.log(e.message); } } 

C'est une bonne pratique de faire quelque chose avec les exceptions capturées.

Ce qui se passe ici, c'est que s'il y a une erreur (par exemple, le chargement d'une page échoue), une exception est lancée dans l'un de tes blocs try. Le bloc de capture correspondant l'attrape et dit "cette exception a été traitée", mais en réalité, vous n'avez rien fait avec elle.

Essayez de mettre une impression (e.Message); À l'intérieur de vos blocs de capture pour savoir exactement quelle erreur provoque la page à ne pas charger, puis ajoute du code à ton bloc catch pour faire face à cette erreur.