2010-09-02 60 views
2
if ($disponivel === 0) 
    { 
     $razao = $check->cd->reason; 
     $mensagem = "the domain isn't available. Reason: ".$razao; 
    } 
    elseif($disponivel === 1) 
    { 
     $mensagem = "the domain doesn't exist - free to register."; 
    } 

    return $mensagem; 
} 
else 
{ 
    throw new EppCommandsExceptions('Domain isn't supported - '.$result->msg, $codigo); 
} 

你看那些$ mensagem字符串?他們也是錯誤消息,我的問題是,我們可以使用幾個拋出異常,而不是讓$ mensagem顯示一些錯誤消息嗎?PHP例外 - 我們可以有多個投擲嗎?

更新: 我的意思不是一次全部拋出的異常。他當時的每一個例外。

由於提前, MEM

+0

我有更新我的問題,以及錯誤信息翻譯。 – MEM 2010-09-02 11:19:19

回答

5

你的意思是這樣

else { 
    throw new XException(...); 
    throw new YException(...); 
    throw new ZException(...); 
} 

...和所有的人都甩 「一次」?

沒有,那是不可能的,也不會轉回去什麼太大的意義恕我直言。客戶端代碼應該如何捕獲這些異常?

而且你shouldn't使用異常作爲正常的流量控制結構的替代者,異常應該只處理,好,出色的錯誤,如不能夠連接到數據庫等

您可以實現另一個自定義例外類錯誤需要一個數組作爲參數,並在客戶端代碼可以做這樣的事情:

catch(SomeException $e) { 
    $messages = $e->getErrorMessages(); 
} 

當我不你的語言講的語言,我真的不能告訴你正在嘗試做的你發佈的代碼位,否則我可以提出更具體的建議。


編輯/ UPDATE:

@MEM感謝您使用英語的錯誤消息更新您的代碼。你是否正在實施類似域名註冊服務?

當然,這是一個有點棘手的問題作爲感到沉淪有他的喜好,但我也不會轉回去拋出一個異常,如果E。 G。用戶試圖註冊已被其他人使用的域。這不是一個特殊的狀態,這是例外。我會製作一個驗證類/方法,收集這些錯誤消息,然後將這些消息顯示給用戶。

我當會扔在你們這樣一個應用程序異常?我不太瞭解域名註冊,但是如果您從遠程服務器/ web服務獲取域名是否免費,並且此web服務已關閉,那麼我會拋出異常。它被捕獲到控制器(我成像一個MVC Web應用程序),然後用「服務器停機,請稍後再試」消息回覆客戶端。

+0

「此外,您不應該將異常用作普通流量控制結構的替代品,異常應該只能處理異常錯誤,例如無法連接到數據庫等。」 嗯......這是一個自定義的例外,只是爲了處理EPP例外。所以,通常我們會有一個用於處理常見錯誤的驗證類。如果通過了驗證層(我可以這樣稱呼它),客戶端和服務器端都會發生異常。爲什麼我們寧願有幾個地方來處理錯誤,而不是隻有一個? thks – MEM 2010-09-02 10:39:50

+0

我最近的評論是一個問題。沒有一個強有力的假設,將導致無處。 :)我試圖更好地理解我們應該在哪裏使用異常或其他事情......以及爲什麼這是更好的選擇。 – MEM 2010-09-02 10:41:11

+0

@MEM請看我的編輯,我試着告訴你我對何時使用異常以及何時適合使用「正常」驗證/控制流程的看法。 – Max 2010-09-02 11:24:09

0

當然,只要繼承了每封郵件的基本異常。

1

你可以拋出並捕獲不同的例外。

如果你想要做的是打印錯誤,你可以藏漢拋出相同類型的例外。但我會假設你需要不同的方法,每種情況

function myFunction() { 
    if($a) { 
    throw new AException('A Error'); 
    } else if($b) { 
    throw new BException('B Error'); 
    } else if($c) { 
    throw new CExceptıon('C Error'); 
    } 
} 

try { 
    myFunctıon(); 
} catch (AException $aException) { 
    echo $aException->getMessage(); 
} catch (BException $bException) { 
    echo "this is a terrible case, don't do that again pls"; 
    $mydbobject->rollback(); 
} catch (CException $cException) { 
    mailDevTeam("the server made a boo boo"); 
} 
+0

你看到「EppCommandsExceptions」嗎?在那裏我擴展了Exception類,所以我想通過這個異常處理程序傳遞所有EppCommand錯誤(如果我可以這樣調用)。目前,是的,這只是向用戶顯示消息的問題。 – MEM 2010-09-02 11:22:29

2

你不能亂扔多,但由於PHP 5.3,你可以提供給previous異常的構造函數來創建例外的鏈接列表。

例如,這裏有一個3項鍊:

$a = new Exception('Exception a'); 
$b = new Exception('Exception b', 0, $a); 
throw new Exception('Exception c', 0, $b); 

然後,在你的異常處理程序,您可以通過鏈遍歷與getPrevious

do { 
    printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e)); 
} while($e = $e->getPrevious());