青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Fork me on GitHub
隨筆 - 215  文章 - 13  trackbacks - 0
<2018年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678


專注即時通訊及網游服務端編程
------------------------------------
Openresty 官方模塊
Openresty 標準模塊(Opm)
Openresty 三方模塊
------------------------------------
本博收藏大部分文章為轉載,并在文章開頭給出了原文出處,如有再轉,敬請保留相關信息,這是大家對原創作者勞動成果的自覺尊重!!如為您帶來不便,請于本博下留言,謝謝配合。

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

相冊

Awesome

Blog

Book

GitHub

Link

搜索

  •  

積分與排名

  • 積分 - 220943
  • 排名 - 117

最新評論

閱讀排行榜

PHP 注冊錯誤和異常處理機制

注冊錯誤和異常處理機制有三個PHP函數需要學習

1. register_shutdown_function('Bootstrap\Library\Frame::fatalError');

2. set_error_handler('Bootstrap\Library\Frame::appError');

3. set_exception_handler('Bootstrap\Library\Frame::appException');

1.register_shutdown_function 

定義:該函數是來注冊一個會在PHP中止時執行的函數

參數說明:

void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )  

注冊一個 callback ,它會在腳本執行完成或者 exit() 后被調用。

callback:待注冊的中止回調

parameter:可以通過傳入額外的參數來將參數傳給中止函數

PHP終止情況有三種

執行完成

復制代碼
<?php   function test()   {       echo '這個是中止方法test的輸出';   }      register_shutdown_function('test');      echo 'before' . PHP_EOL;    // => before   // => 這個是中止方法test的輸出  
復制代碼

注意輸出的順序,等執行完成了之后才會去執行register_shutdown_function的中止方法test  

exit/die導致的中止

復制代碼
<?php   function test()   {       echo '這個是中止方法test的輸出';   }      register_shutdown_function('test');      echo 'before' . PHP_EOL;   exit();   echo 'after' . PHP_EOL;    // => before // => 這個是中止方法test的輸出  
復制代碼

后面的after并沒有輸出,即exit或者是die方法導致提前中止。

發生致命錯誤中止

復制代碼
<?php   function test()   {       echo '這個是中止方法test的輸出';   }      register_shutdown_function('test');      echo 'before' . PHP_EOL;      // 這里會發生致命錯誤   $a = new a();      echo 'after' . PHP_EOL;    // => before // => Fatal error: Uncaught Error: Class 'a' not found in D:\laragon\www\php_book\test.php on line 12 // => Error: Class 'a' not found in D:\laragon\www\php_book\test.php on line 12   // => Call Stack:   // => 0.0020     360760   1. {main}() D:\laragon\www\php_book\test.php:0   // => 這個是中止方法test的輸出
復制代碼

后面的after也是沒有輸出,致命錯誤導致提前中止了。

參數:第一個參數支持以數組的形式來調用類中的方法,第二個以及后面的參數都是可以當做額外的參數傳給中止方法。

復制代碼
<?php      class Shutdown   {       public function stop()       {           echo "這個是stop方法的輸出";       }   }      // 當PHP終止的時候(執行完成或者是遇到致命錯誤中止的時候)會調用new Shutdown的stop方法   register_shutdown_function([new Shutdown(), 'stop']);      // 將因為致命錯誤而中止   $a = new a();      // 這一句并沒有執行,也沒有輸出   echo '必須終止';  
復制代碼

也可以在類中執行:

復制代碼
<?php      class TestDemo {       public function __construct()       {           register_shutdown_function([$this, "f"], "hello");       }          public function f($str)       {           echo "class TestDemo->f():" . $str;       }   }      $demo = new TestDemo();   echo 'before' . PHP_EOL;      /**  運行:  before  class TestDemo->f():hello   */  
復制代碼
可以多次調用 register_shutdown_function,這些被注冊的回調會按照他們注冊時的順序被依次調用。
不過注意的是,如果在第一個注冊的中止方法里面調用exit方法或者是die方法的話,那么其他注冊的中止回調也不會被調用。
代碼:
復制代碼
<?php   /**   * 可以多次調用 register_shutdown_function,這些被注冊的回調會按照他們注冊時的順序被依次調用。   * 注意:如果你在f方法(第一個注冊的方法)里面調用exit方法或者是die方法的話,那么其他注冊的中止回調也不會被調用   */      /**   * @param $str   */   function f($str) {       echo $str . PHP_EOL;          // 如果下面調用exit方法或者是die方法的話,其他注冊的中止回調不會被調用       // exit();   }      // 注冊第一個中止回調f方法   register_shutdown_function("f", "hello");      class TestDemo {       public function __construct()       {           register_shutdown_function([$this, "f"], "hello");       }          public function f($str)       {           echo "class TestDemo->f():" . $str;       }   }      $demo = new TestDemo();   echo 'before' . PHP_EOL;      /**  運行:  before  hello  class TestDemo->f():hello    注意:如果f方法里面調用了exit或者是die的話,那么最后的class TestDemo->f():hello不會輸出   */  
復制代碼
該函數的作用:
  • 析構函數:在PHP4的時候,由于類不支持析構函數,所以這個函數經常用來模擬實現析構函數
  • 致命錯誤的處理:使用該函數可以用來捕獲致命錯誤并且在發生致命錯誤后恢復流程處理

代碼如下:

復制代碼
<?php   /**   * register_shutdown_function,注冊一個會在php中止時執行的函數,中止的情況包括發生致命錯誤、die之后、exit之后、執行完成之后都會調用register_shutdown_function里面的函數   * Created by PhpStorm.   * User: Administrator   * Date: 2017/7/15   * Time: 17:41   */      class Shutdown   {       public function stop()       {           echo 'Begin.' . PHP_EOL;           // 如果有發生錯誤(所有的錯誤,包括致命和非致命)的話,獲取最后發生的錯誤           if (error_get_last()) {               print_r(error_get_last());           }              // ToDo:發生致命錯誤后恢復流程處理              // 中止后面的所有處理           die('Stop.');       }   }      // 當PHP終止的時候(執行完成或者是遇到致命錯誤中止的時候)會調用new Shutdown的stop方法   register_shutdown_function([new Shutdown(), 'stop']);      // 將因為致命錯誤而中止   $a = new a();      // 這一句并沒有執行,也沒有輸出   echo '必須終止';  
復制代碼
復制代碼
Fatal error: Uncaught Error: Class 'a' not found in D:\laragon\www\php_book\1_23_register_shutdown.php on line 31      Error: Class 'a' not found in D:\laragon\www\php_book\1_23_register_shutdown.php on line 31      Call Stack:       0.0060     362712   1. {main}() D:\laragon\www\php_book\1_23_register_shutdown.php:0      Begin.   Array   (       [type] => 1       [message] => Uncaught Error: Class 'a' not found in D:\laragon\www\php_book\1_23_register_shutdown.php:31   Stack trace:   #0 {main}     thrown       [file] => D:\laragon\www\php_book\1_23_register_shutdown.php       [line] => 31   )   Stop.  
復制代碼

注意:PHP7中新增了Throwable異常類,這個類可以捕獲致命錯誤,即可以使用try...catch(Throwable $e)來捕獲致命錯誤,代碼如下:

復制代碼
<?php      try {       // 將因為致命錯誤而中止       $a = new a();          // 這一句并沒有執行,也沒有輸出       echo 'end';   } catch (Throwable $e) {       print_r($e);       echo $e->getMessage();   }  
復制代碼

運行:

復制代碼
Error Object   (       [message:protected] => Class 'a' not found       [string:Error:private] =>       [code:protected] => 0       [file:protected] => C:\laragon\www\php_book\throwable.php       [line:protected] => 5       [trace:Error:private] => Array           (           )          [previous:Error:private] =>       [xdebug_message] =>   Error: Class 'a' not found in C:\laragon\www\php_book\throwable.php on line 5      Call Stack:       0.0000     349856   1. {main}() C:\laragon\www\php_book\throwable.php:0      )   Class 'a' not found  
復制代碼
這樣的話,PHP7中使用Throwable來捕獲的話比使用register_shutdown_function這個函數來得更方便,也更推薦Throwable。
注意:Error類也是可以捕獲到致命錯誤,不過Error只能捕獲致命錯誤,不能捕獲異常Exception,而Throwable是可以捕獲到錯誤和異常的,所以更推薦。
 
總結:register_shutdown_function這個函數主要是用在處理致命錯誤的后續處理上(PHP7更推薦使用Throwable來處理致命錯誤),不過缺點也很明顯,只能處理致命錯誤Fatal error,其他的錯誤包括最高錯誤Parse error也是沒辦法處理的。
 

 

 

2.set_error_handler

通過 set_error_handler() 函數設置用戶自定義的錯誤處理程序,然后觸發錯誤(通過 trigger_error()):

復制代碼
<?php  // 用戶定義的錯誤處理函數  function myErrorHandler($errno, $errstr, $errfile, $errline) {      echo "<b>Custom error:</b> [$errno] $errstr<br>";      echo " Error on line $errline in $errfile<br>";  }   // 設置用戶定義的錯誤處理函數  set_error_handler("myErrorHandler");   $test=2;   // 觸發錯誤  if ($test>1) {      trigger_error("A custom error has been triggered");  }  ?> 
復制代碼

以上代碼的輸出類似這樣:

Custom error: [1024] A custom error has been triggered  Error on line 14 in C:\webfolder\test.php

定義和用法

set_error_handler() 函數設置用戶定義的錯誤處理函數。

注釋:如果使用該函數,會繞過標準 PHP 錯誤處理程序,同時如果必要,用戶定義錯誤程序通過 die() 終止腳本。

注釋:如果錯誤發生在腳本執行之前(比如文件上傳時),將不會調用自定義的錯誤處理程序因為它尚未在那時注冊。

語法

set_error_handler(errorhandler,E_ALL|E_STRICT);
參數描述
errorhandler必需。規定用戶錯誤處理函數的名稱。
E_ALL|E_STRICT可選。規定顯示何種錯誤報告級別的用戶定義錯誤。默認是 "E_ALL"。

技術細節

返回值:包含之前定義的錯誤處理程序的字符串。
PHP 版本:4.0.1+
PHP 更新日志:

PHP 5.5:參數 errorhandler 現在接受 NULL

PHP 5.2: 錯誤處理程序必須返回 FALSE 來顯示 $php_errormsg。

3.set_exception_handler

設置用戶定義的異常處理函數:

復制代碼
<?php // 用戶定義的異常處理函數  function myException($exception) {      echo "<b>Exception:</b> ", $exception->getMessage();  }   // 設置用戶定義的異常處理函數  set_exception_handler("myException");  // 拋出異常 throw new Exception("Uncaught exception occurred!");  ?> 
復制代碼

以上代碼的輸出類似這樣:

Exception: Uncaught exception occurred!

定義和用法

set_exception_handler() 函數設置用戶定義的異常處理函數。

腳本會在此異常處理程序被調用后停止執行。

語法

set_exception_handler(exceptionhandler);
參數描述
exceptionhandler

必需。規定當一個未捕獲的異常發生時所調用函數的名稱。

注釋:也可以傳遞一個 NULL 值用于重置異常處理函數為默認值。

技術細節

返回值:

返回包含之前定義的異常處理程序的名稱的字符串,或者在錯誤時返回 NULL。

如果之前沒有定義一個錯誤處理程序,也會返回 NULL。

如果參數使用了 NULL,重置處理程序為默認狀態,并且會返回一個 TRUE。

PHP 版本:5.0+
PHP 更新日志:

PHP 7.0.0:傳遞到 exception_handler 中的參數類型從 Exception 更改為 Throwable。

PHP 5.5:之前,如果傳遞 NULL,該函數返回 TRUE。從 PHP 5.5 起返回之前的處理程序。

 

原創文章請隨便轉載。愿和大家分享,并且一起進步。-- 江 coder

C#中unhandled異常處理的問題

為了增強現在正在開發的系統的健壯性,需要捕獲運行時出現的無法預料而且沒有被處理(unhandled)的異常。查了資料后,找到了使用 Application.ThreadException 事件處理這些異常的方法,基本步驟包括, 
1、為ThreadException事件添加一個處理異常的函數句柄 
2、定義處理異常的函數 
例子如下: 
[STAThread] 
static
void Main() {   Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);   Application.Run(new FrmMain()); } private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) {   MessageBox.Show("Unhandled exception: "+e.Exception.ToString()); }
這種方法簡單易行,而且處理效率較高,可以按照用戶的意圖,很方便的添加處理異常理的其他功能。但我發現,如果使用第三方提供的控件時,根本不起作用,原應可能是第三方控件運行在不同的線程中。在Microsoft的幫助中也確實提到了,上面的方法只能處理主線程中未處理的異常。好了,上網查,找到了下面的方法,使用 AppDomain.UnhandledException 替代Application.ThreadException
首先需要了解的是,此時定義的事件處理函數需要在拋出異常的線程中執行,但是在主線程中給出異常提示都是在主線程中完成的,那么如何解決這個問題呢?下面的代碼給出了一個比較完整的解決方案。
 
private delegate void ExceptionDelegate(Exception x);

static private FrmMain _MainForm;

///
<summary>
///
The main entry point for the application.
/// </summary>
[STAThread]
static
void Main()
{
  _MainForm = new FrmMain();
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_UnhandledException);
  Application.Run(_MainForm);
}

private static void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  Exception exception;

  exception = e.ExceptionObject as Exception;
  if (exception == null)
{
// this is an unmanaged exception, you may want to handle it differently
   return;
}
  PublishOnMainThread(exception);
}

private static void PublishOnMainThread(Exception exception)
{
  if (_MainForm.InvokeRequired)
  {
    // Invoke executes a delegate on the thread that owns _MainForms's underlying window handle.
    _MainForm.Invoke(new ExceptionDelegate(HandleException), new object[] {exception});
  }
  else
  {
    HandleException(exception);
  }
}

private static void HandleException(Exception exception)
{
  if (SystemInformation.UserInteractive)
  {
    using (ThreadExceptionDialog dialog = new ThreadExceptionDialog(exception))
    {
      if (dialog.ShowDialog() == DialogResult.Cancel)
        return;
    }
    Application.Exit();
    Environment.Exit(0);
  }
}

private void ThreadMethod()
{
  throw new Exception("From new thread");
}

private void button1_Click(object sender, System.EventArgs e)
{
  Thread thread;
  thread = new Thread(new ThreadStart(ThreadMethod));
  thread.Start();
}
需要注意的是:
1、需要為所有的 AppDomain 的 UnhandledException 添加一個處理
2、 UnhandledExceptionEventArgs 參數中包含一個 IsTerminating 屬性,表示是否中止 common language runtime 

posted on 2018-08-03 17:43 思月行云 閱讀(616) 評論(0)  編輯 收藏 引用 所屬分類: PHP
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合伊人| 久久久www成人免费毛片麻豆| 久久久久网址| 一区二区三区视频在线观看| 久久久久成人网| 亚洲欧洲精品一区| 国产精品草莓在线免费观看| 欧美主播一区二区三区| 六月婷婷久久| 欧美一级淫片aaaaaaa视频| 老司机凹凸av亚洲导航| 亚洲欧美久久| 欧美成人午夜激情| 久久国产精品高清| 欧美日韩大片| 欧美高清视频一区二区| 国产精品一区二区三区四区| 亚洲第一视频| 久久成人18免费观看| 国产视频一区二区三区在线观看| 亚洲欧美另类在线观看| 影音先锋在线一区| 午夜在线精品偷拍| 亚洲欧洲av一区二区| 欧美日本精品| 亚洲欧洲日韩在线| 国产精品99久久久久久久女警| 亚洲性线免费观看视频成熟| 国产一区二区三区四区老人| 亚洲图片你懂的| 免费在线视频一区| 国产日韩欧美综合在线| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲精品在线观看视频| 久久久免费精品| 午夜国产一区| 欧美亚洲不卡| a4yy欧美一区二区三区| 亚洲美女诱惑| 欧美成人中文字幕| 国产在线不卡视频| 亚洲欧美日韩一区二区在线 | 久久亚洲午夜电影| 久久亚洲免费| 黄色成人在线观看| 久久精品人人做人人爽电影蜜月| 久久av一区二区三区| 国产乱码精品一区二区三区五月婷| 一本色道久久综合亚洲精品婷婷| 在线视频日本亚洲性| 欧美伦理a级免费电影| 亚洲区在线播放| av不卡在线看| 国产精品成av人在线视午夜片| 亚洲视频一区二区| 性色av香蕉一区二区| 国产麻豆精品在线观看| 欧美伊久线香蕉线新在线| 久久久人成影片一区二区三区观看 | 亚洲专区免费| 国产精品视频一二三| 午夜一区二区三区不卡视频| 久久久久久一区二区| 极品尤物久久久av免费看| 久久久精品国产99久久精品芒果| 麻豆精品精品国产自在97香蕉| 1024日韩| 欧美日韩日本视频| 亚洲一区二区三| 久久乐国产精品| 久久成人综合网| 猛男gaygay欧美视频| 91久久久久久久久久久久久| 欧美日本精品| 欧美一区二区三区在线看| 老司机免费视频久久| 亚洲激情视频网| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日韩精品| 亚洲综合二区| 欧美成人综合网站| 在线视频日韩精品| 国产在线精品一区二区中文| 欧美不卡在线视频| 亚洲一区二区三区免费观看| 久久在线视频在线| 在线一区视频| 韩国v欧美v日本v亚洲v| 欧美激情一二三区| 欧美一区二区三区四区在线观看 | 一区精品久久| 欧美日韩少妇| 久久精品一区蜜桃臀影院 | 亚洲免费av片| 久久久人成影片一区二区三区观看 | 欧美啪啪成人vr| 国产欧美日韩精品a在线观看| 狠狠久久五月精品中文字幕| 9i看片成人免费高清| 老鸭窝亚洲一区二区三区| 在线视频国产日韩| 亚洲专区在线视频| 久久久久国产精品一区| 久久天天狠狠| 亚洲一二三区视频在线观看| 激情久久久久久| 国产精品嫩草影院av蜜臀| 久久综合狠狠综合久久综青草| 一区二区三区日韩精品| 亚洲第一精品影视| 久久久久国产精品一区三寸| 在线午夜精品自拍| 91久久久久久| 狠狠色狠狠色综合日日小说| 国产精品成人va在线观看| 欧美成人网在线| 久久夜色精品国产亚洲aⅴ| 亚洲综合电影| 亚洲特级片在线| 99xxxx成人网| 日韩亚洲欧美成人| 亚洲国产一区二区三区青草影视| 久久久久久综合网天天| 欧美一区三区二区在线观看| 亚洲一区二区三区四区中文| 99re热这里只有精品视频| 在线看日韩欧美| 黄色另类av| 黄色精品网站| 伊人精品久久久久7777| 国产一区二区三区在线观看网站 | 久久精品人人| 香蕉成人啪国产精品视频综合网| 一区二区三区www| 一区二区三区 在线观看视频| 亚洲精品中文字幕有码专区| 亚洲黄一区二区| 亚洲精品国产精品国产自| 亚洲欧洲日本国产| 日韩一区二区精品视频| 亚洲毛片播放| 亚洲午夜久久久久久久久电影院 | 欧美在线二区| 欧美一区二区啪啪| 国产精品在线看| 国产精品裸体一区二区三区| 国产精品久久二区二区| 国产精品视频成人| 国产午夜精品一区二区三区视频 | 在线高清一区| 亚洲日本成人| 在线一区二区视频| 亚洲免费视频网站| 性色av一区二区三区| 久久精品国产亚洲aⅴ| 久久亚洲免费| 亚洲国产精品一区二区第四页av| 亚洲精品久久久久久下一站| 亚洲精品日韩激情在线电影| 亚洲精品一区二区三区99| 亚洲国产日韩欧美在线99 | 亚洲高清视频的网址| 亚洲国产精品一区二区三区| 看片网站欧美日韩| 女仆av观看一区| 欧美久久一区| 国产精品女主播| 国产亚洲欧美日韩精品| 在线精品亚洲一区二区| 夜色激情一区二区| 欧美一区二区视频观看视频| 久久综合给合久久狠狠狠97色69| 欧美激情二区三区| 亚洲午夜视频在线| 久久综合伊人77777尤物| 欧美日韩亚洲综合一区| 国产精品一区二区三区成人| 在线成人性视频| 亚洲小视频在线| 乱码第一页成人| 一本色道久久综合亚洲精品不 | 在线欧美视频| 日韩一级欧洲| 久久精品国产久精国产思思| 欧美激情视频一区二区三区免费| 亚洲视频免费观看| 免费在线欧美视频| 国产美女在线精品免费观看| 91久久精品美女高潮| 午夜欧美不卡精品aaaaa| 欧美激情精品久久久久久| 亚洲一区bb| 欧美激情亚洲综合一区| 国产综合久久久久久鬼色| 亚洲午夜久久久久久久久电影网| 免费一区视频| 欧美亚洲综合在线| 国产精品久久激情| 野花国产精品入口| 亚洲高清激情|