2010-04-15 12 views
7

Tengo este problema de intento y captura. Estoy intentando redirigir a una página diferente. Pero a veces lo hace y algunas veces no. Creo que el problema es intentar y atrapar. Puede alguien ayudarme a entender esto. GraciasComprender try..catch en Javascript

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

Respuesta

19

creo que su problema principal es que usted está tragar excepciones, lo cual es muy malo . Esta es la razón por la cual "funciona a veces". Algo está arrojando una excepción, y la estás atrapando, pero luego no estás haciendo nada más después de eso. Por lo menos, mostraría algún tipo de mensaje de error en su bloque catch.

A otros pocos problemas:

  • ¿Seguro que necesitan esos múltiples try..catch bloques? La suposición actual en su código es que cada línea envuelta en un try..catch es independiente de las demás, y la ejecución aún puede continuar si algo sale mal en cualquiera (o más) de esas declaraciones. ¿Estás seguro de que esto es lo que quieres? Si es así, definitivamente hay una mejor manera de manejar esto.
  • Si las declaraciones son no independientes entre sí, y si una falla en cualquier punto significa que la ejecución no puede proceder, a continuación, se puede envolver todas esas declaraciones en un solo bloque try..catch y mostrará un mensaje de error en el catch
  • Como dije antes, tragar excepciones es muy malo! Estás escondiendo el problema y no logrando nada. También hace que la depuración sea extremadamente difícil, porque las cosas dejarán de funcionar y no tendrá idea de por qué (sin excepción, sin registro, sin mensajes de error). Las excepciones se usan cuando ocurre algo inesperado que interrumpe el flujo normal del programa. Es algo que definitivamente quieres manejar.

Creo que lo que desea se puede hacer de esta manera:

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

esta manera, si se produce una excepción en cualquier lugar a lo largo de esas series de declaraciones, el bloque catch lo manejará.

Javascript no tiene verdaderas excepciones comprobadas. Puede solucionarlo teniendo un solo bloque de prueba e inspeccionando el objeto de excepción que recibe *.

Ampliando en lo que he hablado anteriormente, hay dos formas de manejar excepciones. La primera forma, como mostré anteriormente, asume que cuando ocurre una excepción, el código está en un estado no válido/indefinido y esto significa que el código encontró un error irrecuperable. Otra forma de manejar excepciones es saber que es algo de lo que puede recuperarse. Puedes hacer esto con una bandera. Entonces:

try { 
    doSomething(); 
} 

catch(e) { 
    error = true; 
} 

if(error) { 
    doStuffToRecoverFromError(); 
} 

else { 
    doOtherStuff(); 
} 

En este caso, el flujo de su lógica depende de una excepción que se arroje. Lo importante es que la excepción es recuperable, y dependiendo de si fue lanzada o no, haces cosas diferentes.

* Aquí hay un ejemplo algo inventado que muestra las excepciones comprobadas. Tengo dos excepciones llamadas VeryBadException y ReallyBadException que se pueden lanzar (aleatoriamente) desde dos funciones.El bloque catch maneja la excepción y se da cuenta de qué tipo de excepción es usando el operador instanceof):

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); 
    } 
} 
+0

Creo que sé cuál es el problema, pero no estoy seguro de cómo solucionarlo. Entonces cualquier ayuda será apreciada. El problema es pid variable de pg.exit = función (pid) { --- } y aquí Ajax.Post ("/ emr/hideRecord/act_hideRecord.php", n, pg.exit (pid)); si hago esto Connect.Ajax.Post ("/ emr/hideRecord/act_hideRecord.php", n, pg.exit); y pg.exit = function() {var pid = '75465' } entonces funciona. pero necesito que el valor se envíe dinámicamente y no esté codificado allí. Gracias – Autolycus

+0

¿Cuál es la firma de Connect.Ajax.Post? –

3

Es una buena práctica hacer algo con las excepciones atrapados.

Lo que está sucediendo aquí es que si hay un error (digamos que cargar una página falla) se lanza una excepción dentro de uno de tus bloques de prueba. El bloque catch correspondiente lo agarra y dice "esa excepción se ha tratado", pero en realidad no has hecho nada con eso.

Intenta poner una impresión (e.Mensaje); dentro de sus bloques de captura para descubrir exactamente qué error está causando que la página no se cargue y luego agregue código a su bloque catch para lidiar con este error.