异常处理,按合同设计

Fra*_*anz 0 delphi

对于没有用户界面访问权限的函数,使用未指定参数处理无效函数调用的最佳方法是什么

   function safeSQRT ( x : Real)  : real; 
   begin

   ///  check for valid params .....

    if (x<0) then 
            begin
            exit;

            ///  create a exception here ??

            end; 



   end; 
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

有这个签名

function safeSQRT(x : Real): Real;
Run Code Online (Sandbox Code Playgroud)

您只有两个选项来表示错误:

  1. 提出例外.
  2. 返回指示错误的sentinel值.

第三种选择是更改签名

function safeSQRT(x : Real; out retval: Real): Integer;
Run Code Online (Sandbox Code Playgroud)

函数返回值现在是错误代码.

如果返回错误代码,则强制调用者明确检查每个调用的每个返回值.这是一个沉重的负担.想想调用即使是最平凡的Win32 API来描绘负担的乐趣.

如果返回标记值,则会对每个调用者施加相同的负担.

如果你引发异常,那么调用者的工作就更容易了.调用者通常可以忽略异常并让它们向上冒泡并作为中心异常处理程序处理.

另一方面是错误情况通常发生并需要立即处理.在这种情况下,提出异常通常是错误的选择.如果必须始终在呼叫站点处理错误,则使用异常会使调用者忘记处理它.