在PHP中,如何让类中的其他方法知道何时从另一个方法中抛出异常?

lyr7nygr  于 2023-06-28  发布在  PHP
关注(0)|答案(2)|浏览(85)

我有一个方法可以将HTML翻译成另一种语言。该方法内部是一个try,catch块,用于处理网络错误。我有另一个方法,如果发生错误,则返回true。另一个显示错误消息。
但是,我还没有找到一种方法,让这两种方法都知道翻译失败的时候。
下面是处理实际翻译的方法(它是一个名为Translate的trait的一部分)。$status是一个数组,它是使用此trait的TranslateContent类中的变量。

protected function translateHTML(object $translator, string $content, string $target_language, array $status):string {
    
    if($target_language == 'en'){
      
      return $content;
    
    } 
        
    if($content):
        
        try{

          $content_translated = $translator->translateText($content, 'en', $target_language, 
              ['tag_handling' => 'html'], 
              ['formality', 'prefer_less'],
              ['split_sentences', 0]
            );

          return $content_translated;

        } catch(Exception $error){

          $status['status'] = true;
          $status['message'] = $error->getMessage();

          return $content;
        }

    endif;

    return $content;

  }

在使用trait Translate的TranslateContent类的顶部,我声明了$status:

protected $status = [
      'error' => false,
      'message' => ''
    ];

下面是使用translateHTML()方法的方法,在该方法中抛出异常。我添加的最后一个参数是上面创建的状态数组。(注意:我在这里传递了一个不正确的目标语言来触发异常。

public function translatePostContent(string $content):string {

        $post_language = $this->getPostLanguage($this->post_id);
        
        $target_language = $post_language['deepl_language_code'];

        return $this->translateHTML($this->translator, $content, 'doesnt-exist', $this->status );

    }

最后是返回状态方法:

public function hasError():bool{

      return $this->status['error'];

      
    }

public function getErrorMessage():string{
      
      return $this->status['message'];

    }

我的想法是,如果在转换尝试期间抛出异常,我需要从catch块中更新$status的状态。但$状态未更新。相反,示例化TranslateContent的代码运行时就像根本没有错误一样。
我最初认为这是一个作用域问题,但从我所读到的内容来看,catch块在PHP中没有作用域。
我错过了什么?

rqqzpn5f

rqqzpn5f1#

看起来你想要的是通过引用传递$status变量。
你可以通过重新定义你的translateHTML签名前缀&你的$status变量:

protected function translateHTML(object $translator, string $content, string $target_language, array &$status):string {

这样,当你“编辑”变量时,你将编辑传递给方法的实际变量(而不是默认的副本)。
上面的应该可以工作,但是也许你可能想把$status属性移到trait本身。这样,您就可以使用$this->status访问它,而根本不需要传递它。

ctzwtxfj

ctzwtxfj2#

你可以这样声明$status

protected $status = [
      'error' => false,
      'message' => ''
    ];

但是你的catch块犯了两个错误:

$status['status'] = true;
    $status['message'] = $error->getMessage();

您应该更新$this->status,并设置$this->status['error'],如下所示:

$this->status['error'] = true;
    $this->status['message'] = $error->getMessage();

这样,对translateHTML()的调用就不需要传入$status变量。

return $this->translateHTML($this->translator, $content, 'doesnt-exist');

用于检索错误状态和消息的方法正在正确地访问类属性,因此它们现在应该可以工作了。
不需要通过引用传递$status,或者根本不需要。这就是类属性的作用。

相关问题