DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: superstar666
今日帖子: 47
在线用户: 24
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 lsh998 (lsh) ★☆☆☆☆ -
盒子活跃会员
2004/4/16 10:23:26
标题:
delphi 异常处理问题,谢谢!~ 浏览:1584
加入我的收藏
楼主: 这个程序的目的是为了扑捉在(delphi+数据库)时产生的异常,利用application的onexception的事迹来响应异常,以便程序员,能够扑捉。 
在工程文件的程序如下: 
  
program project1 
uses 
forms,windows,classes,dialogs,db,,dbtables,sysutils, 
unit1 in ’unit1.pas’ {form1}; 

  

type 
tmyclass=class(tobject) 
public 
procedure  AppException(Sender :TObject; E:Exception);  
procedure  DBEngineError( E :EDBEngineError );  
procedure  DatabaseError( E :EDatabaseError );  
function     strkeyviol(str:string):string; 
function     strreqderr(str  string):string; 
function      strforeignkey(str string):string; 
funtion        str(detailrecordexist(str:string):string; 
function       strtranengconstriant(str:string):string; 
end; 

//================  
// 数据库错误处理  
//================  

procedure Tmyclass.AppException(Sender :TObject; E:Exception);  
begin  
  if (E is EDBEngineError) then begin  
    if ( E as EDBEngineError ).ErrorCount>1 then  
      DBEngineError( E as EDBEngineError )  
    else  
      Application.ShowException(E);  
  end else if (E is EDatabaseError) then begin  
    DatabaseError( E as EDatabaseError );  
  end else  
    Application.ShowException(E);  
end;  
  
  
//对于服务器错误,处理Errors[0,1]  


procedure Tmyclass.DBEngineError( E :EDBEngineError );  
var 
errcode_keyviol:tdberror; 
begin  
  case E.Errors[0].SubCode of  
  ERRCODE_KEYVIOL: // Primary Key, Unique Index  //11111111111 
    ShowError( strKeyViol(E.Errors[1].Message) );  
  else{case}  
    Application.ShowException(E);  
  end;{case}  
end;  

  
//处理本地发现的错误  
procedure tmyclass.DatabaseError( E :EDatabaseError );  
begin  
  if Pos(’must have a value’, E.Message)<>0 then  
    ShowError(’”’ + strGetToken( E.Message, ’’’’ ) + ’”不能为空’ )  
  else if Pos(’ not a valid float’,E.Message)<>0 then begin  
    ShowErr or(’您输入的数字不合法’)  
  end else  
    Application.ShowException(E);  
end;  

function Twyclass.strKeyViol( str: string ): string;  
var  
  strE: string;  
begin  
{$IFDEF DBMS_SQL65}  
  strE := strGetToken( str, ’’’’ );  
  Result := ’”’ + strTranEngConstraint(strE) + ’”不能重复’;  
{$ELSE IFDEF DBMS_INTER5}  
  strE := strGetToken( str, ’”’ );  
  Result := ’”’ + strTranEngConstraint(strE) + ’”不能重复’;  
{$ENDIF}  
end;  

function tmyclass.strReqdErr( str: string ): string;  
var  
  strE: string;  
begin  
{$IFDEF DBMS_SQL65} &nb sp; 
  strE := strGetToken( str, ’’’’ );  
  Result := ’”’ + strTranEngConstraint(strE) + ’”不能为空’;  
{$ELSE IFDEF DBMS_INTER5}  
  strE := strGetToken( str, ’”’ );  
  Result := ’”’ + strTranEngConstraint(strE) + ’”不能为空’;  
{$ENDIF}  
end;  

function Tmyclass.strForeignKeyErr( str: string ): string;  
var  
  strE: string;  
begin  
{$IFDEF DBMS_SQL65}  
  strE := strGetToken( str, ’’’’ );  
  if Pos(’DELETE’, str) > 0 then  
    Result := ’”’ + strTranEngConstraint(strE) + ’”已经被引用,不能删除’  
  el se  if Pos(’INSERT’, str) > 0 then  
    Result := ’引用”’ + strTranEngConstraint(strE) + ’”不存在,不能增加’  
  else //UPDATE, for master and detail  
    Result := ’”’ + strTranEngConstraint(strE) + ’”已经使用,不能修改’  
{$ELSE IFDEF DBMS_INTER5}  
  strE := strGetToken( str, ’”’ );  
  Result := ’”’ + strTranEngConstraint(strE) + ’”已经被引用,或者不存在’;  
{$ENDIF}  
end;  

function Twyclass.strDetailRecordsExist( str: string ): string;  
begin  
{$IFDEF DBMS_SQL65}  
  //Not support  
{$ELSE IFDEF DBMS_INTER5}  
  //Not support  
{$ ENDIF}  
end;  

function Tmyclass.strTranEngConstraint( str: string ): string;  
var  
  i: integer;  
  isFound: boolean;  
begin  
  isFound := False;  
  for i := 0 to maxConstraint do  
    if a2strConstraint[i,conE] = str then begin  
      isFound := True;  
      Break;  
    end;  

  if isFound then  
    Result := a2strConstraint[i,conC]  
  else  
    Result := ’未知错误(’ + str + ’)’;  
end;  
  
这个出现出现的第一个错误就在//11111111111那里 
出现的错误是:" ’errcode_keyviol ’ constant expression expected’//’errcode_keyviol 需要常量表达式。 


请问我要怎样定义’errcode_keyviol 才能使其成为常量表式。还要在uses子句里加别的 单元文件吗? 

还有我别的资料上看到的其原文是: 
BDE 目录下的 idapi.h给出了所有的常量定义,下面摘录其中的一部分: 
#define errcode_keyviol      //key violation 
#define errcode_foriegnkeyerr     //master record missing 


TDBError.Errcode 实际的返回值是上面的值加 errbase_iniegrity,  errbase_iniegrity等于9728 
在同意一个文件可以找到他们的定义: 
#define errbase_iniegrity                   ox2600//integrity violation 
#define dbeerr_keyviol                       (errbase_iniegrity+errcode_keyviol      ) 


但是我不知道怎么用上面的东西,我不知道在那里定义他们,也不知道怎么定义他们? 



----------------------------------------------
lsh
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行58.59375毫秒 RSS