Delphi 异常处理,按合同设计

Delphi 异常处理,按合同设计,delphi,Delphi,对于没有用户界面访问权限的函数,处理带有未指定参数的无效函数调用的最佳方法是什么 function safeSQRT ( x : Real) : real; begin /// check for valid params ..... if (x<0) then begin exit; /// create a exception here ?? en

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

   function safeSQRT ( x : Real)  : real; 
   begin

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

    if (x<0) then 
            begin
            exit;

            ///  create a exception here ??

            end; 



   end; 
函数safeSQRT(x:Real):Real;
开始
///检查有效的参数。。。。。
如果(x有此签名

function safeSQRT(x : Real): Real;
function safeSQRT(x : Real; out retval: Real): Integer;
只有两个选项可以发出错误信号:

  • 提出一个例外
  • 返回指示错误的sentinel值
  • 第三种选择是更改签名

    function safeSQRT(x : Real): Real;
    
    function safeSQRT(x : Real; out retval: Real): Integer;
    
    其中,函数返回值现在是一个错误代码

    如果返回错误代码,则会迫使调用方明确检查每个调用的每个返回值。这是一个沉重的负担。想想调用最普通的Win32 API来描述这个负担的乐趣吧

    如果您返回一个sentinel值,那么每个调用者都会承受相同的负担

    如果引发异常,则调用方的工作会更容易。调用方通常可以忽略异常,让它们向上冒泡,并作为中心异常处理程序进行处理

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

    function safeSQRT(x : Real): Real;
    
    function safeSQRT(x : Real; out retval: Real): Integer;
    
    只有两个选项可以发出错误信号:

  • 提出一个例外
  • 返回指示错误的sentinel值
  • 第三种选择是更改签名

    function safeSQRT(x : Real): Real;
    
    function safeSQRT(x : Real; out retval: Real): Integer;
    
    其中,函数返回值现在是一个错误代码

    如果返回错误代码,则会迫使调用方明确检查每个调用的每个返回值。这是一个沉重的负担。想想调用最普通的Win32 API来描述这个负担的乐趣吧

    如果您返回一个sentinel值,那么每个调用者都会承受相同的负担

    如果引发异常,则调用方的工作会更容易。调用方通常可以忽略异常,让它们向上冒泡,并作为中心异常处理程序进行处理


    另一方面,错误情况经常发生,需要立即处理。在这种情况下,引发异常通常是错误的选择。如果必须始终在调用站点处理错误,则使用异常可能会导致调用方忘记处理错误。

    在引发异常之前,您将退出该函数在第一次引发异常之前,您将退出该函数。