2010-07-15 128 views
4

抛出新异常时,最好仅在没有异常需要抛出时返回true。另外最好是返回false而不是抛出异常。我使用PHP。抛出异常和返回类型

回答

13

这一切都取决于你在做什么。就个人而言,我用他们所有的时间,这样我就不必检查返回值(A愚蠢的,而是说明性的例子):

function ArrayToObject(array $array) { 
    $obj = new StdClass(); 
    foreach ($array as $key => $value) { 
     if (!is_string($key)) { 
      throw new Exception('Expects only string keys in the array'); 
     } 
     $obj->$key = $value; 
    } 
    return $obj; 
} 

这样一来,我可以这样做:

$array = array('foo' => 'bar'); 
try { 
    echo ArrayToObject($array)->foo; //Prints "bar" 
} catch (Exception $e) { 
    //Handle error here 
} 

它可以让你不用担心错误检查你的结果。您可以在catch块中正确处理错误。

所以,不,不会改变你要去基于例外返回什么......让例外处理错误,并为你改变工作流程...

一个更真实的例子(以伪代码):

try { 
    open database connection; 
    send query to database; 
    operate on results; 
} catch (DatabaseConnectionException $e) { 
    handle failed connection here; 
} catch (DatabaseQueryException $e) { 
    handle failed query here; 
} catch (Exception $e) { 
    handle any other errors here; 
} 

很显然,这是假设你的数据库函数/方法抛出这些异常...

0

这取决于你的函数的目的和回国的原因。 使用异常在错误/意外情况期间从函数返回。使用标准操作的返回值。

同样,不要使用返回值来标记意外情况。如果你的函数 不会返回任何有意义的空指针引用,除以零,没有数据连接,你应该抛出异常。一,它让你用catch块隔离你的错误处理代码。二,它可以让你提供更多的信息,为什么它失败而不是'错误'。非常恼人的事情失败时,所有的信息只是'错误'。

此外,您不想抛出异常作为流量控制的替代方法。你可以变得富有创造性并且写一个比较函数,如果它是平等的,它就什么都不做,如果不相等则抛出一个GreaterThanException或LessThanException。但是,现在你已经失去了分离错误处理代码的优势(因为标准处理代码现在包含在catch块中并且包含错​​误代码)。另外,虽然我不确定在许多环境(如php)中执行异常处理的情况,但创建异常对象并对catch块进行类型比较而非仅仅返回可能会更昂贵。