当发生异常时,显示中止,重试,忽略对话框,当选择了重试,如何跳到错误代码处重新执行,专业的做法该是怎样的?

ciml 2001-09-27 12:19:36
bcb好像没有提供这样的机制!
...全文
433 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
april_d 2001-10-07
  • 打赏
  • 举报
回复
gz
ciml 2001-09-28
  • 打赏
  • 举报
回复
我一直想不通,为什么bcb的异常类没有错误代码,只有错误消息,如果有

错误代码就不至于想这样写了:

E.Message.Pos("Unknown user name or password")!=0

真的没有吗?没有的话,我得想想自己派生了!
xycleo 2001-09-28
  • 打赏
  • 举报
回复
老大一出手就是好东西1!!


俺拿下了1!
Wingsun 2001-09-27
  • 打赏
  • 举报
回复
有啊!你可以这样写哦!
Screen->Cursor=crHourGlass;
TRegistry * pRegInfo=new TRegistry();
bool bContinue=true;
AnsiString Sa,Password;
AnsiString Server;
pRegInfo->RootKey=HKEY_LOCAL_MACHINE;
pRegInfo->OpenKey("\\Software\\mysoft\\ddd",true);
Server=pRegInfo->ReadString("Server Name");
Sa=pRegInfo->ReadString("User");
Password=pRegInfo->ReadString("Pass");
if(Sa=="")
{
Sa="SA";
pRegInfo->WriteString("User","SA");
}
if(Server=="")
{
Screen->Cursor=crDefault;
MessageBox(Application->Handle,"不能与服务器建立连接,请输入服务器名称。",
"不能与服务器建立连接",MB_OK+MB_ICONSTOP+MB_APPLMODAL);
FrmServerName=new TFrmServerName(this);
FrmServerName->EdtServerName->Text=Server;
if(FrmServerName->ShowModal()==mrOk)
{
pRegInfo->WriteString("Server Name",FrmServerName->EdtServerName->Text);
Server=FrmServerName->EdtServerName->Text;
}
else
{
bContinue=false;
}
Screen->Cursor=crHourGlass;
delete FrmServerName;
}
dtaCjda->Params->Values["Server NAME"]=Server;
dtaCjda->Params->Values["USER NAME"]=Sa;
dtaCjda->Params->Values["Password"]=Password;
dtaCjda->Session->SQLHourGlass =false;
while((!dtaCjda->Connected) && bContinue)
{
try
{
dtaCjda->Connected =true;
}
catch(EDatabaseError &E)
{
if((E.Message.Pos("Specified SQL server not found")!=0)||
(E.Message.Pos("Cannot locate or connect to SQL server")!=0))//找不到服务器。
{
Screen->Cursor=crDefault;
MessageBox(Application->Handle,"不能与服务器建立连接,请输入服务器名称。",
"不能与服务器建立连接",MB_OK+MB_ICONSTOP+MB_APPLMODAL);
FrmServerName=new TFrmServerName(this);
FrmServerName->EdtServerName->Text=dtaCjda->Params->Values["Server Name"];
if(FrmServerName->ShowModal()==mrOk)
{
pRegInfo->WriteString("Server Name",FrmServerName->EdtServerName->Text);
dtaCjda->Params->Values["Server Name"]=FrmServerName->EdtServerName->Text;
}
else
{
bContinue=false;
}
Screen->Cursor=crHourGlass;
delete FrmServerName;
}
else if(E.Message.Pos("Unknown user name or password")!=0)//用户名或口令不对。
{
Screen->Cursor=crDefault;
MessageBox(Application->Handle,"不能登录进入服务器,请输入SQL Server 用户名和口令。",
"不能与服务器建立连接",MB_OK+MB_ICONSTOP+MB_APPLMODAL);
FrmUserPassword=new TFrmUserPassword(this);
FrmUserPassword->EdtUser->Text=dtaCjda->Params->Values["USER NAME"];
FrmUserPassword->EdtPassword->Text=dtaCjda->Params->Values["PASSWORD"];
if(FrmUserPassword->ShowModal()==mrOk)
{
pRegInfo->WriteString("Pass",FrmUserPassword->EdtPassword->Text);
pRegInfo->WriteString("User",FrmUserPassword->EdtUser->Text);
dtaCjda->Params->Values["USER NAME"]=FrmUserPassword->EdtUser->Text;
dtaCjda->Params->Values["PASSWORD"]=FrmUserPassword->EdtPassword->Text;
}
else
{
bContinue=false;
}
delete FrmUserPassword;
Screen->Cursor=crHourGlass;
}
else
{
Screen->Cursor=crDefault;
AnsiString Prompt;
Prompt="发生未知错误:\n";
Prompt+=E.Message;
MessageBox(Application->Handle,Prompt.c_str(),
"发生未知错误",MB_OK+MB_ICONSTOP+MB_APPLMODAL);
bContinue=false;
Screen->Cursor=crHourGlass;
}
}
}
pRegInfo->CloseKey();
delete pRegInfo;
Screen->Cursor=crDefault;
return dtaCjda->Connected;
maquanjun 2001-09-27
  • 打赏
  • 举报
回复
我记得安装bcb时,它会提示你一个设置,就是这个问题,但它好像不会提示你终止吓重试,而是直接就跳到错误代码处
ciml 2001-09-27
  • 打赏
  • 举报
回复
gz
ciml 2001-09-27
  • 打赏
  • 举报
回复
HEROIN(HEROIN)

的方法也是一种方法,但可能不是很好的方法,因为递归可能导致栈溢出

用户完全可以按重试按钮按着玩!
ciml 2001-09-27
  • 打赏
  • 举报
回复
春阳:

你那只是在程序中自己逐一判断,我觉得你那样还比较繁琐。不如把需要的参数全部以

对话框的形式出现提示用户输入,每当某个参数为空或者因为参数错误而登陆失败,都

调用该对话框要求用户重新指定参数。

比如服务器没有开,那么登陆必定失败,所以可以提示让用户重试(用户开了服务器后)

类似的还有软盘没有准备好等错误。这类错误是可以由用户干预而避免的,vb里就有

相关的语句可以自动跳到错误发生处重新执行。bcb中好像没有,难道我自己要用循环

来实现。而且即使自己来实现,程序结构可能很混乱,而且可能弄得比较复杂!
HEROIN 2001-09-27
  • 打赏
  • 举报
回复
呵呵,上面括号位置有些错误

void LogOn()
{
bool OK=JudgePassword();

if(!OK)
{
int i= Application->MessageBox("密码校验","密码错误",MB_ABORTRETRYIGNORE)

if(i==IDABORT )
Application->Termite();
if(i==IDCANCEL )return;
if(i==IDRETRY )
LogOn();
}
else
{
.....
}

}
HEROIN 2001-09-27
  • 打赏
  • 举报
回复
我一般用递归来处理

void LogOn()
{
bool OK=JudgePassword();

if(!OK)
{
int i= Application->MessageBox("密码校验","密码错误",MB_ABORTRETRYIGNORE)

if(i==IDABORT )
Application->Termite();
if(i==IDCANCEL )return;
if(i==IDRETRY )
LogOn();

else
{
.....
}

}





}



}
书生 2001-09-27
  • 打赏
  • 举报
回复
春阳出手了。学习~

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧