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:
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. try..catch
et afficher un message d'erreur dans la catch
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.