如何把c++builder中的异常,翻译成汉语提示

tiger_hs 2008-12-20 05:45:51
有一个数据库应用程序,当客户和服务器失去联系后,如果访问数据库,会出现一下的提示:
ORA-01012: not logged on
客户要求,把提示改成中文。
我有一个愚蠢的办法,在每个访问数据库的代码段,都捕获异常,并检查如果是这个错误,翻译成对应的中文,问题是,程序的代码太长,如果每个代码段都这么处理,由于代码量过大,是不实际的,也不科学。
能否有一种好的机制,
或者 1 在c++一个地方捕获所有的异常,并翻译
或者 2 Oracle的错误异常截获,并翻译
或者 3 其他的好办法,能简单的翻译这些异常信息。
...全文
185 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiger_hs 2008-12-24
  • 打赏
  • 举报
回复
最终结果:

前面的确是破获到了异常,因为没有判断参数输入的异常,而事访问了TADOConnection的已经发生的异常,
一次表现出第二次捕获,一下是最终的解决方案:

void __fastcall TMainDm::my_AdoConnExecuteComplete(
TADOConnection *Connection, int RecordsAffected, const Error *Error,
TEventStatus &EventStatus, const _Command *Command,
const _Recordset *Recordset)
{
if(EventStatus != esOK ){
String str = Error->Description;
if(str.Pos("ORA-01012") || str.Pos("ORA-03114"))
{
String chnMsg = "你的程序已经和服务器失去联系,请重新登陆.;";
ShowMessage(chnMsg);
PostQuitMessage(0);
}
}
}
//---------------------------------------------------------------------------
我不懂电脑 2008-12-23
  • 打赏
  • 举报
回复
主要是工作量问题,楼上的方法都可以。
痞子酷 2008-12-23
  • 打赏
  • 举报
回复
呵呵,如果是oracle数据库错误,你可以根据oracle提供中文错误帮助中进行整理,根据oracle数据库反馈的错误代码,找到相应的中文错误描述
Behard 2008-12-23
  • 打赏
  • 举报
回复
我觉得没有必要

不是客户所有的要求都能满足的
ynszx 2008-12-23
  • 打赏
  • 举报
回复
看看可比可以修改你编译的程序里的字符资源,比如用: Restorator 2007 打开程序文件进行修改。
我原来编译的程序比如:DBGrid中按下Ctrl+Delete删除记录提示的是英文,我记下提示的英文,用Restorator 2007
找到里面的字符资源修将相应的英文改成中文,运行后发现提示是中文的。
xjq2003 2008-12-23
  • 打赏
  • 举报
回复
期待学习到更好的方法
tiger_hs 2008-12-23
  • 打赏
  • 举报
回复
该问题已经部分解决了:
使用下面的代码,可以在该错误第二次发生时,捕获到该错误,主要原理是相应
TADOConnection.OnExecuteComplete事件。
现在的问题是:如果能够屏蔽BCB自动显示的那个异常。即不让BCB处理异常。



//解决BCB6.0的编译问题,于本主题无关
namespace System
{
void __fastcall CheckSafecallResult(HRESULT hResult)
{
OleCheck(hResult);
}
};
//---------------------------------------------------------------------------

void __fastcall TMainDm::my_AdoConnExecuteComplete(
TADOConnection *Connection, int RecordsAffected, const Error *Error,
TEventStatus &EventStatus, const _Command *Command,
const _Recordset *Recordset)
{
if(EventStatus != esOK ){
bool bDisconnected = false;
for(int i=0;i<my_AdoConn->Errors->Count;i++){
String str = my_AdoConn->Errors->Item[i]->Description;
if(str.Pos("ORA-01012") || str.Pos("ORA-03114"))
{
bDisconnected = true;
break;
}
}
if(bDisconnected){
String chnMsg = "你的程序已经和服务器失去联系,请重新登陆.;";
ShowMessage(chnMsg);
PostQuitMessage(0);
}
}
}
//---------------------------------------------------------------------------
僵哥 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tiger_hs 的回复:]
谢谢楼上。
我认为楼上这个办法能解决问题,可是这个项目的大约有1000个c++文件,超过20万行的代码,如果每个文件都修改,可能需要很长的时间。能不能有更好的办法呢?
[/Quote]
现在不改,将来可能就是5000个CPP文件.
tiger_hs 2008-12-22
  • 打赏
  • 举报
回复
谢谢楼上。
我认为楼上这个办法能解决问题,可是这个项目的大约有1000个c++文件,超过20万行的代码,如果每个文件都修改,可能需要很长的时间。能不能有更好的办法呢?
nbzip 2008-12-22
  • 打赏
  • 举报
回复
这个提示,是由数据库驱动提供的.
一般都是提交1211数据,然后,由驱动的错误集中一行对应错误,给出错误.呵呵,

我觉得,一楼没说错,得把平时要报错的错误,转成自己的错误集,然后把中文与之对应.
================
还有一种,就是驱动程序找个中文版的,那么有可能报错就为中文(这里还是不一定的)
tiger_hs 2008-12-22
  • 打赏
  • 举报
回复
1) 这个异常我认为是可能是 EDatabaseError 或者 EADOError 异常,不知是否有办法能修改这两个类处理特定异常提示信息呢?
2) not logged on 这个信息是一个Oracle异常信息,来自于Oracle,因此不能使用修改资源的方法来处理。
qqlpp 2008-12-22
  • 打赏
  • 举报
回复
ding
shadowstar 2008-12-22
  • 打赏
  • 举报
回复
not logged on 也许是一个resourcestring

如果是C++Builder的异常,在Application.OnException事件处理,或者修改主程序异常处理代码。

如果一个一个翻译真提是愚蠢的办法,假设让你再改成别国文字呢?
52vc 2008-12-22
  • 打赏
  • 举报
回复
如果,你能得到金山的帮助,那么你这个问题就好解决了!~
tjg5202 2008-12-22
  • 打赏
  • 举报
回复
楼主不要犹豫了。。。动手吧
wesleyluo 2008-12-20
  • 打赏
  • 举报
回复
我觉得是不是可以写个翻译的处理函数,在有异常的地方都调用它得了。

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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