2010年7月8日 星期四

[javascript & PHP] Try ... Catch ...

源自:http://www.klstudio.com/post/46.html
一、使用Mozilla瀏覽器的用戶可以直接在Tools下的Javascript Console進行查看瀏覽器找到的錯誤.
二、 自己使用例外處理來捕獲JavaScript的異常。
如下是Javascript的例外處理的一個實例。
var array = null;
try {
    document.write(array[0]);
} catch(err) {
    document.writeln("Error name: " + err.name + "");
    document.writeln("Error message: " + err.message);
}
finally{
    alert("object is null");
}
程序執行過程
1. array[0]的時候由於沒有創建array數組,array是個空對象,程序中調用array[0]就會產生object is null的異常
2. catch(err)語句捕獲到這個異常通過err.name打印了錯誤類型,err.message打印了錯誤的詳細信息.
3. finally類似於java的finally,無論有無異常都會執行.

現總結Error.name的六種值對應的信息:
1. EvalError:eval()的使用與定義不一致
2. RangeError:數值越界
3. ReferenceError:非法或不能識別的引用數值
4. SyntaxError:發生語法解析錯誤
5. TypeError:操作數類型錯誤
6. URIError:URI處理函數使用不當
-----------------------------------

PHP
■ Exceptions 例外處理
◆ throw
throw $exception-object;
丟出例外

◆ try...catch
[語法] 可包含多個 catch 敘述
try {
      ......
} catch(Exception-Class $variable) {
      ......
}


[說明]
1. try 敘述之後至少必須有一個 catch 敘述。
    參數型態 Exception-Class 可以是內建的 Exception 類別、任何繼承(或衍生)內建 Exception 的類別名稱。
2. catch 區塊內可再丟出(rethrow) 例外(exception)
    catch 區塊內也可以使用空敘述不做任何例外處理。
3. try 敘述區塊內若丟出例外,則在該例外後的剩餘區塊程式碼不會被執行,接著 PHP 會判別例外所符合的錯誤類別而執行相對應的 catch 敘述
4. 如果丟出例外後找不到符合的 catch 敘述比對條件,會出現 Fatal Error 的錯誤訊息 "Uncaught Exception ..."。此種情況可使用例外處理函式 set_exception_handler() 處理 Fatal Error。
5. PHP 無 finally 區塊處理
6. 所有的例外錯誤都必須自行提供程式碼加以處理,否則 PHP 會丟出 uncaught exception 的 fatal error 錯誤訊息(unchecked Exception Error??)。

[註] PHP 4 使用 trigger_error() 搭配 set_error_handler() 回呼函式(callback function)做 error handling。

[範例]
try {
    ......         // Code which might throw an exception
} catch (FirstExceptionClass $exception) {
    ......         // Code which handles this exception
} catch (SecondExceptionClass $exception) {
}

[範例]
try {
    $error_msg = '丟出錯誤';
    throw new Exception($error_msg);
    echo 'Never executed';       // Code following an exception is not executed
} catch (Exception $e) {
    echo 'Exception Caughted: ',  $e->getMessage(), "
";
}
echo 'Hello World!';        // Continue execution
/*
Exception Caughted: 丟出錯誤
Hello World!
*/



◆ Extending Exceptions
1. PHP 內建 Exception class,該類別可提供除錯訊息與例外產生的原因等相關資訊。
2. 藉由繼承或衍生內建的 Exception class,可自訂例外事件的處理方式。

‧Built in Exception class
class Exception {
   /* property ------------------------------------ */
   protected $message = 'Unknown exception';  // exception message
   protected $code = 0;                        // user defined exception code
   protected $file;                            // source filename of exception
   protected $line;                            // source line of exception
   ......

   /* constructor ------------------------------------ */
   function __construct($message = null, $code = 0);

   /* method ------------------------------------ */
   final function getMessage();                // message of exception
   final function getCode();                  // code of exception
   final function getFile();                  // source filename
   final function getLine();                  // source line
   final function getTrace();                  // an array of the backtrace()
   final function getTraceAsString();          // formated string of trace

   /* Overrideable */
   function __toString();                      // formated string for display
}

If a class extends the built-in Exception class and re-defines the constructor, it is highly recomended that it also call parent::__construct() to ensure all available data has been properly assigned.
The __toString() method can be overriden to provide a custom output when the object is presented as a string.

[範例]
class MyException extends Exception {
     function __construct($exception) {
           $this->exception = $exception;
     }
     function Display() {
           print "MyException: $this->exception\n";
     }
}
try {
      throw new MyException('Hello World');
} catch (MyException $exception) {
      $exception->Display();
} catch (Exception $exception) {
      echo $exception;
}

【下列文章您可能也有興趣】

沒有留言: