在 PHP Try Catch 块中抛出异常

问题描述 投票:0回答:6

我在 Drupal 6 .module 文件中有一个 PHP 函数。我试图在执行更密集的任务(例如数据库查询)之前运行初始变量验证。在 C# 中,我过去常常在我的 Try 块的开头实现 IF 语句,如果验证失败则抛出新的异常。抛出的异常将在 Catch 块中被捕获。以下是我的 PHP 代码:

function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    throw $e->getMessage();
  }
}

但是,当我尝试运行代码时,它告诉我只能在 Catch 块中抛出对象。

php exception try-catch drupal-6
6个回答
115
投票
function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    /*
        Here you can either echo the exception message like: 
        echo $e->getMessage(); 

        Or you can throw the Exception Object $e like:
        throw $e;
    */
  }
}

73
投票

重新抛出做

 throw $e;

不是消息。


16
投票

只需从 catch 块中删除

throw
——将其更改为
echo
或以其他方式处理错误。

不是告诉你只能在catch块中抛出对象,是告诉你只能抛出对象,错误的位置在catch块中——是有区别的

在 catch 块中,你试图抛出你刚刚捕获的东西——在这种情况下无论如何这没什么意义——而你试图抛出的东西是一个字符串。

你正在做的一个真实世界的类比是接球,然后试图将制造商的标志扔到其他地方。您只能抛出整个对象,而不是对象的属性。


7
投票

你试图扔一个

string

throw $e->getMessage();

您只能抛出实现

\Throwable
的对象,例如
\Exception
.

作为旁注:异常通常用于定义应用程序的异常状态,而不是用于验证后的错误消息。当用户给你无效数据时也不例外


0
投票

Throw 需要一个由

\Exception
实例化的对象。只要抓到
$e
就可以玩了。

throw $e

0
投票

在这种情况下,您可以尝试创建自定义异常类,以便您知道哪种验证失败。

创建自定义异常类:

<?php
/**
 * Define a custom exception class
 */
class MyException extends Exception
{
    // Redefine the exception so message isn't optional
    public function __construct($message, $code = 0, Throwable $previous = null) {
        // some code

        // make sure everything is assigned properly
        parent::__construct($message, $code, $previous);
    }

    // custom string representation of object
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }

    public function customFunction() {
        echo "A custom function for this type of exception\n";
    }
}

参考:扩展异常

您可以根据您的要求创建任意数量的自定义例外。假设您已经创建了自定义异常名称 EmptyFieldException 和 InvalidDataException。

function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new EmptyFieldException("The field is undefined."); 
    }else if(strlen($field) > 5){
      throw new InvalidDataException("The field is Invalid."); 
    }
    // rest of code here...
  }
  catch (EmptyFieldException $e) {
    throw $e->getMessage();
  }catch (InvalidDataException $e) {
    throw $e->getMessage();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.