了解Javascript中的try..catch

了解Javascript中的try..catch,javascript,exception-handling,error-handling,try-catch,Javascript,Exception Handling,Error Handling,Try Catch,我有一个“捉迷藏”的问题。我正在尝试重定向到另一个页面。但有时会,有时不会。我认为问题在于“捉迷藏”。有人能帮我理解这一点吗。谢谢 var pg = new Object(); var da = document.all; var wo = window.opener; pg.changeHideReasonID = function(){ if(pg.hideReasonID.value == 0 && pg.hideReasonID.selectedIndex >

我有一个“捉迷藏”的问题。我正在尝试重定向到另一个页面。但有时会,有时不会。我认为问题在于“捉迷藏”。有人能帮我理解这一点吗。谢谢

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();
 }
}
var pg=新对象();
var da=document.all;
var wo=窗口开启器;
pg.changeHideReasonID=函数(){
如果(pg.hideReasonID.value==0&&pg.hideReasonID.selectedIndex>0){
pg.otherReason.style.backgroundColor=“ffffff”;
pg.otherReason.disabled=0;
pg.otherReason.focus();
}否则{
pg.otherReason.style.backgroundColor=“F5”;
pg.otherReason.disabled=1;
}
}
pg.exit=功能(pid){
试一试{
if(window.opener.hideRecordReload){
window.opener.hideRecordReload(pg.recordID,pg.recordTypeID);
}否则{
window.opener.pg.hideRecord(pg.recordID,pg.recordTypeID);
}
}捕获(e){}
试一试{
window.opener.pg.hideEncounter(pg.recordID);
}捕获(e){}
试一试{
window.opener.pg.hideRecordResponse(pg.hideReasonID.value==0?pg.otherReason.value:pg.hideReasonID.options[pg.hideReasonID.selectedIndex].text);
}捕获(e){}
试一试{
window.opener.pg.hideRecord_响应(pg.recordID,pg.recordTypeID);
}捕获(e){}
试一试{
window.opener.pg.hideRecord_响应(pg.recordID,pg.recordTypeID);
}捕获(e){}
试一试{
window.opener.window.parent.frames[1].pg.loadQualityMeasureRequest();
}捕获(e){}
试一试{
window.opener.pg.closeWindow();
}捕获(e){}
loadCenter2({reportName:'redirectedpage',patientID:pid});
父项。$.fancybox.close();
}
pg.hideRecord=函数(){
var pid=this.pid;
pg.otherReason.value=pg.otherReason.value.trim();
如果(pg.hideReasonID.selectedIndex==0){
警报(“您尚未指明隐藏此记录的原因。”);
pg.hideReasonID.focus();
}else if(pg.hideReasonID.value==0&&pg.hideReasonID.selectedIndex>0&&pg.otherReason.value.length<2){
警报(“您已表示希望输入列表中未列出的原因,但尚未输入原因。”);
pg.otherReason.focus();
}否则{
pg.workin(1);
var n=新对象();
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]。文本;
Connect.Ajax.Post(“/emr/hideRecord/act_hideRecord.php”,n,pg.exit(pid));
}
}
pg.init=函数(){
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.change hideReasonID;
pg.hideReasonID.tabIndex=1;
pg.otherReason=da.otherReason;
pg.otherReason.tabIndex=2;
pg.otherReason.onblur=函数(){
this.value=this.value.trim();
}
pg.otherReason.onfocus=函数(){
这是select();
}
pg.btnCancel=da.btnCancel;
pg.btnCancel.tabIndex=4;
pg.btnCancel.title=“关闭此窗口”;
pg.btnCancel.onclick=函数(){
//window.close();
父项。$.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=函数(){
if(event.srcielement.tagName.search(/INPUT | TEXT/i)){
返回false;
}
}
pg.workin(0);
}
pg.workin=函数(){
var n=arguments.length?参数[0]:1;
pg.content.disabled=pg.hideReasonID.disabled=n;
pg.blocker.style.display=pg.hourglass.style.display=n?“块”:“无”;
如果(n){
pg.otherReason.disabled=1;
pg.otherReason.style.backgroundColor=“F5”;
}否则{
pg.otherReason.disabled=!(pg.hideReasonID.value==0&&pg.hideReasonID.selectedIndex>0);
pg.otherReason.style.backgroundColor=pg.otherReason.disabled?“F5F5”:“ffffff”;
pg.hideReasonID.focus();
}
}

我认为您的主要问题是您正在接受异常,这是非常糟糕的。这就是为什么“它有时会起作用”。有些东西抛出了一个异常,您正在捕获它,但之后您就不再做任何其他事情了。至少我会在
catch
块中显示某种错误消息

其他一些问题:

  • 您确定需要这些多个
    try..catch
    块吗?代码中当前的假设是,包装在
    try..catch
    中的每一行都独立于其他行,如果这些语句中的任何一条(或多条)出现错误,执行仍然可以继续。你确定这就是你想要的吗?如果是这样的话,肯定有更好的处理方法
  • 如果这些语句不是相互独立的,并且如果在任何点出现故障意味着无法继续执行,则可以将所有这些语句包装在一个
    try..catch
    块中,并在
    catch
    中显示错误消息
  • 就像我之前说的,吞咽异常是非常糟糕的!你隐藏了问题,却一事无成。这也使得调试变得非常困难,因为事情将停止工作,而您将不知道原因(没有异常、没有日志记录、没有错误消息)。当意外事件中断正常程序流时,使用异常。这是你绝对想处理的事情
我认为你想要的可以这样做:

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);
}   
这样,如果在这一系列语句的任何地方发生异常,
catch
块将处理它

Javascript也没有真正的检查异常。您可以通过使用单个try块并检查接收到的异常对象*来绕过它

根据我之前所说的,有
try {
   doSomething();
}

catch(e) {
   error = true;
}

if(error) {
   doStuffToRecoverFromError();
}

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