我可以声明一个 php 函数抛出异常吗?

Posted

技术标签:

【中文标题】我可以声明一个 php 函数抛出异常吗?【英文标题】:Can I declare that a php function throws an exception? 【发布时间】:2011-03-20 12:16:47 【问题描述】:

我可以在php中声明一个函数吗 抛出异常? 例如:

public function read($b, $off, $len) throws IOException 

【问题讨论】:

没有系统来声明可能抛出哪些异常。您可以轻松地抛出它们,但最多可以在函数之前的 phpdoc(类似 javadoc)注释中添加 @throws。 +1 表示 Wrikken 的评论 这个问题的真正答案是Wrikken的评论。 【参考方案1】:

您可以在 PHPDoc 注释中使用 @throws,IDE 会在查看文档时将此函数识别为抛出异常,但与 Java 不同的是,它不会强制您实现 Trycatch 块。也许未来版本的 IDE(我正在使用 InteliJ 11)将标记那些需要 trycatch 的地方,这与在识别不一致时对 doc 标记的 javascript 类型(例如 String)所做的相同。

简而言之,在编写脚本语言(PHP、JavaScript..)时使用 Doclet 可以在非类型安全和非编译语言的情况下成为更安全编程的补充工具。

像这样:

enter code here
/**
 * Handle 'get' operations
 * @abstract
 * @param int $status reference for setting the response status
 * @param String $body reference for setting the response data
 * @return mixed
 * @throws Exception if operation fail
 */
function get(&$status, &$body) 

【讨论】:

这应该是 IMO 接受的答案(OP 想要明确指出一个函数可以抛出异常并且没有询问如何抛出异常),尽管图像中的大量尾随空白应该是已删除。 php 7 怎么样?还是什么都没有? 不,还是什么都没有。【参考方案2】:

我误读了这个问题,请参阅下面 Gilad 的答案(应该被接受)。

上一个答案:

你可以从函数体中抛出一个新的异常。都描述了here

例子:

<?php
function inverse($x) 
    if (!$x) 
        throw new Exception('Division by zero.');
    
    else return 1/$x;


try 
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
 catch (Exception $e) 
    echo 'Caught exception: ',  $e->getMessage(), "\n";


// Continue execution
echo 'Hello World';
?>

【讨论】:

是的,我读过它,因为我在想它可能是可行的,但我错过了教程。好的,所以我不能声明一个引发异常的方法? IOException 怎么样,我需要自己创建它吗? 不,它不存在。但是你可以声明它(扩展一个适当的 SPL 异常(class IOException extends RuntimeException Gilad 给出了正确答案。您需要使用 PHPDoc。 这不是这个问题的答案。问题是如何声明,而不是如何抛出异常。【参考方案3】:

有关 SPL 附带的异常列表:SPL Exceptions。

如果你想创建自己的异常:

来自PHP Exceptions 页面:

抛出的对象必须是Exception Class 的实例或Exception 的子类。试图抛出一个不是的对象将导致 PHP 致命错误。

所以是的,可以创建自己的例外。只需阅读一点,就可以帮助您实现您想要的。

【讨论】:

谢谢 声明函数抛出异常怎么样?我只需要抛出异常 我是否必须捕获每个异常,即使它是像 OutOfRangeException 这样的简单异常?我不能在不捕获任何异常的情况下运行代码吗?

以上是关于我可以声明一个 php 函数抛出异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何对mysql抛出异常(php)

Python哈希函数啥情况下抛出异常

C++的构造函数可以抛出异常么

java一个疑问,为啥有些异常throw出去需要在函数头用throws声明,一些就不用。

Java异常处理中关键字throws,throw,try,catch,finally分别代表啥意义?在try块中可以抛出异常吗?

Java:构造函数中抛出异常,我的对象仍然可以创建吗?