当我在一个Transactional Data Module(SOrder)中调用另一个Transactional Data Module(UpdateStock)时,无法获得updatestock抛出的错误:
SOrder:
var
upstk:iupdatestock;
begin
olecheck(datamod.ObjectContext.CreateInstance,CLASS_UpdateStock,IID_IUpdateStock,upstk));
try
upstk.method1(orderID,updatestock_s.UPDATE_OUTSTOCK);
except
on e:eoleexception do logtofile(e.message);
end;
end;procedure UpdateStock.method1(....)
begin
//.....do something
if (hasError) then raise EOleException.create('库存不足',.....);
end;可是在调用方只能抓到'灾难性故障';
请问如何才能获得UpdateStock.method1抛出的错误信息
SOrder:
var
upstk:iupdatestock;
begin
olecheck(datamod.ObjectContext.CreateInstance,CLASS_UpdateStock,IID_IUpdateStock,upstk));
try
upstk.method1(orderID,updatestock_s.UPDATE_OUTSTOCK);
except
on e:eoleexception do logtofile(e.message);
end;
end;procedure UpdateStock.method1(....)
begin
//.....do something
if (hasError) then raise EOleException.create('库存不足',.....);
end;可是在调用方只能抓到'灾难性故障';
请问如何才能获得UpdateStock.method1抛出的错误信息
解决方案 »
- 求解1M的ADSL为什么下载有8M的速度?救命啊
- 就是想认识大家,希望各位以后能给予照顾!
- 高手请进,关于socket的连接数量和连接速度的问题~~!!!
- 一用 idFTP.List就没反应,在线等待,请各位帮帮忙
- 能不能把一个clientdataset指向另一个clientdataset?
- 用paintbox画图被清除问题
- directorylistbox中的文件夹显示问题
- 征集意见:写一个酒店管理系统.分不够再加
- 用sql语句怎样求出某一个字段值为null值的记录个数?
- 继续请教按妞提交后的页面源文件,在线等!死等老师回答详细
- 太菜了,有分
- 用InstallShield6.31制作安装程序时,如果把图标编程6.3版本一样的图。而不要它原来的。或者干脆把整个对方框图标改了。高手指点,谢谢了
谢谢,在UpdateStock.method1里面 try 可以,但调用过程是client-->sorder(com+)-->updatestock.method1,错误信息要从method1-->sorder-->client。主要是错误信息如何返回的问题
出错时写入这个属性
CLIENT读取这个属性性就知道出什么问题了
try{
object2.method2(...);
}catch(StockLackException e){
//do something....
}catch(DuplicateKeyException e){
//do something....
}
}object2.method2(...){
//do something...
if (lack){
throws new StockLackException('库存不足');
}
if (dublicatekey){
throws new DubliceatekeyException('主键重复');
}
}我们大家多多讨论。
……
try
upstk.method1(orderID,updatestock_s.UPDATE_OUTSTOCK);
except
on e:eoleexception do logtofile(e.message);
raise; // 在这里重新抛出异常, 客户端能够捕获
end;
end;IErrorInfo 等处理错误的接口已经被封装到 Delphi 的 safecall 异常处理中了,不用你自己实现。
^^^^^^^^
这是什么东东??, 是一个全局变量!! 两个用户(线程)在同时访问时 datamod 指得是哪个线程?? 哪怕你用 self. 也好
谢谢,但这段代码是在一个ActionObject里面(主要是为了实现系统多样性),所以会把datamodule传入。
如果是client-->com+你说的是对的,但client-->com+1-->com+2,com+1 try不道com+2的exception,只能抓到'灾难性故障'
delphi 如果没有 safecall 得到错误内容的方法是 OleError(HRESULT), 一切正常但 BCB, 得到却得到 '服务器发生意外'
定义在xxx_TLB.pas
IUpdateStock = interface(IAppserver)
['{587B82DC-82C1-49DB-9F2B-CC48350D133D}']
procedure method1(const orderID: WideString; UpdateKind: Integer); safecall;
end;
com+1
tryexcept
raise;
end;
com+2
tryexcept
raise;
end;
这样的话client-->com+1-->com+2,错误就会从com+2里逐步传递出来。
procedure TTransStarter.Action;
var
Trans :ITransactionContextEx;
Category :ICategory; // 这两个是用 MSSQL2000 的 Northwind 的两个表
Product :IProduct;
begin
Trans := CreateTransactionContextEx;
try
OleCheck(Trans.CreateInstance(CLASS_Category, ICategory, Category));
OleCheck(Trans.CreateInstance(CLASS_Product, IProduct, Product)); Category.Action('Hello world');
Product.Action('Hello world');
SetComplete;
except
Trans.Abort;
raise;
end;
end;// 这里有错, ICategory 实现跟这基本一样
procedure TProduct.Action(const ProductName: WideString);
begin
try
with InsertCmd, InsertCmd.Parameters do
begin
ParamValues['ProductName'] := ProductName;
Execute;
end; raise Exception.Create('hello except from trans'); // 有意
SetComplete;
finally
// SetAbort; 如果这个用 DisableCommit 代替就正常
raise;
end;
end;
// SetAbort; 如果这个用 DisableCommit 代替就正常
raise;
end;
client-->com+1-->com+2, com+1 应该 try 得到 com+2 的 exception
TObj1 = class(TMtsAutoObject, IObj1)
protected
procedure Method1; safecall;
end;procedure TObj1.Method1;
var
Intf: IObj2;
begin
try
Intf := CoObj2.Create;
Intf.Method2;
SetComplete;
except
on Exception do
begin
SetAbort;
raise;
end;
end;
end;// 这是 com+2type
TObj2 = class(TMtsAutoObject, IObj2)
protected
procedure Method2; safecall;
end;procedure TObj2.Method2;
begin
try
raise Exception.Create('TObj2.Method2 Exception');
SetComplete;
except
on Exception do
begin
SetAbort;
raise;
end;
end;
end;// clientprocedure TForm3.Button1Click(Sender: TObject);
var
Intf: IObj1;
begin
Intf := CoObj1.Create;
Intf.Method1;
end;
try的到exception,但拿不到详细信息
raise; 一定在 SetAbort; 之后,
我的datamodule是事务模型
就是不能捕捉到数据库的raiserror
谁有办法?
谢谢,用 DisableCommit 代替就正常了,WHY?
谢谢,用 DisableCommit 代替就正常了,WHY?
谢谢,用 DisableCommit 代替就正常了,WHY?
谢谢,用 DisableCommit 代替就正常了,WHY?散分了,谢谢大家。
散分了,谢谢大家。
散分了,谢谢大家。