2015-01-15 74 views
0

比方說,我有實例化時所接受的SomeClass數組類,例如:PHP - 自定義異常消息行號

class ConfigurableClass 
{ 
    public function __construct(array $config = array()) 
    { 
     foreach($config as $param) 
     { 
      if(!$param instanceof SomeClass) 
      { 
       $type = gettype($param); 
       $line = ? // How can I retrieve this? 
       throw new Exception("ConfigurableClass config parameters must be of type SomeClass, $type given in line $line"); 
      } 
     } 
    } 
} 

而且我們說這個類實例化在不同的文件

$instance = new ConfigurableClass(array(
    new SomeClass(), 
    new SomeClass(), 
    new SomeClass(), 
    'Ooops!',  // String type, line 5 
    new SomeClass() 
)); 

如何可以拋出一個錯誤消息,其指定在錯誤的對象類型插入的行號:具有錯誤類型的一個元件,例如一個數組? 在這種情況下,相應的消息應爲:

"ConfigurableClass config parameters must be of type SomeClass, string given in line 4" 

請記住,這只是一個例子。真正的類可以接受一個非常龐大而複雜的數組。在這種情況下了解行號可能非常有用。

+0

http://php.net/manual/en/language.constants.predefined.php但要處理您的特定情況,您可能需要按照堆棧回溯的方式工作。 –

+0

你不應該需要這個,只是讓用戶知道他們通過了一個不正確的類型,你甚至可以通過利用func_get_args給他們哪些參數是不正確的http://php.net/manual/en/function.func-get -args.php –

+0

@ZachSpencer如果我想讓他們的生活變得更簡單,該怎麼辦?想象一下,這個類可以接受非常大的配置數組,那麼它會有用嗎? –

回答

1

沒有辦法確定行(在你的情況下是5),因爲它是在調用者指令的末尾給出的,也就是分號所在的位置(在你的情況下是7)。

但是,通過顯示行號和錯誤的參數號可以得到一個很好的近似值。

<?php 
class ConfigurableClass 
{ 
    public function __construct(array $config = array()) 
    { 
     $counter = 0; 

     foreach($config as $param) 
     { 
      if(!$param instanceof SomeClass) 
      { 
       $type = gettype($param); 
       $line = debug_backtrace()[0]['line']; 
       throw new Exception("ConfigurableClass config parameter[$counter] must be of type SomeClass, $type given in line $line"); 
      } 

      $counter++; 
     } 
    } 
} 

該消息將是這樣的:

致命錯誤:用消息「ConfigurableClass config參數未捕獲的異常 '異常'[3]的類型必須是SomeClass的,在C給定的字符串的:\你\在第12行的文件夾\ origin_file.php中C:\ your \ folder \ ConfigurableClass.php在第15行

如果在消息中想要避免引用ConfigurableClass文件和行,則必須創建您自己的派生異常類並覆蓋__toString()方法。