1. 程式人生 > >Perl中的alarm、eval、die的聯合使用

Perl中的alarm、eval、die的聯合使用

1. eval:

eval是一個表示式,而不是if和while這樣的控制結構,eval塊發生嚴重錯誤時,eval塊會停止執行,但程式不會崩潰。所以在程式中執行有可能引起嚴重錯誤的程式碼塊,但又不想影響後續程式的執行時,可以把這部分程式碼塊放入eval中。eva塊正常執行,還是發生了嚴重錯誤,放在[email protected]中,如果沒錯,[email protected]為空,否則存放錯誤的原因。可以用[email protected]的boolean值判斷結果:print [email protected] if [email protected]

 

有四種類型的錯誤,eval不能捕捉,例如記憶體不足等系統錯誤,perl都沒法跑起來。

想退出eval程式碼塊,用的是die,而不是exit

2. alarm:

alarm exp;

alarm;

如果exp被忽略,則用$ _的值來代替。實際的時間延遲是不準確的,因為不同的系統實現了不同的報警功能。實際時間可能是可達的第二或小於所請求的值。 在任何一個時間內只能設定一個鬧鐘定時器。

eg1:

 $timeout=5;
 eval {
           local $SIG{ALRM} = sub { die "after $timeout seconds,run alarm\n" }; #設定超時時的處理函式
           alarm $timeout;
           sleep 10;
           print "in alarm eval\n";
           alarm (0); #程式執行完成,取消前面的超時處理,並且不會開啟一個新的超時操作。


    };
print "out of alarm eval\n";
if ([email protected]) {
    if ([email protected] =~ /die in sig alarm/) {
          print "caught the error";
    }
     else {
          print [email protected];
    }
 }

output:

# perl test.pl
out of alarm eval
after 5 second,run alarm

解析:因為在eval塊中,設定了alarm 5;之後,執行後面的程式碼塊,5s後已經超時了,程式還只執行在sleep 5,所以eval裡面的print未執行;

如果將sleep 10換成sleep 2:

# perl test.pl
in alarm eval
out of alarm eval

所以如果alarm $timeout和alarm 0之間的程式碼執行時間超過了$timeout,就會die,退出eval;

eg2:

 $SIG{ALRM} = sub {
         system("killall -9 firefox") or warn "Fail to kill firefox process \n";
    };

alarm 20;
system("firefox");
alarm 0;

解析:

在執行這段程式碼的時候,firefox最後並沒有被kill掉,那是因為alarm 20和alarm0之間的程式碼執行時間沒有超過20s,然後alarm 0已經取消了超時操作。

如果想在20s後,kill掉firefox,可以如下:

 $SIG{ALRM} = sub {
         system("killall -9 firefox") or warn "Fail to kill firefox process \n";
    };

alarm 20;
system("firefox");
sleep 21;
alarm 0;


相關推薦

Perlalarmevaldie聯合使用

1. eval: eval是一個表示式,而不是if和while這樣的控制結構,eval塊發生嚴重錯誤時,eval塊會停止執行,但程式不會崩潰。所以在程式中執行有可能引起嚴重錯誤的程式碼塊,但又不想影響後續程式的執行時,可以把這部分程式碼塊放入eval中。eva塊正常執行,還

內置函數-maxminroundsortedordchranyalldirevalexecmapfilter

簡單 http 結果 world -s www. [] 安全 pytho http://www.nnzhp.cn/archives/152 1、max,min,round 1 print(max([3,4.563,3,6,2.5])) #取最大值,可循環參數即可,int類

AlphaBetaRCGARTMOEMRVLEVALRTL各個版本的區別

Alpha、Beta、RC、GA、RTM、OEM、RVL、EVAL、RTL各個版本的區別 Alpha:是內部測試版,一般不向外部發布,會有很多Bug.一般只有測試人員使用。 Beta:也是測試版,這個階段的版本會一直加入新的功能。在Alpha版之後推出。 RC:(Release Candidate):

Python可執行物件——execevalcompile

http://www.pythoner.com/56.html 這篇文章將對Python提供的呼叫可執行物件的內建函式進行說明,涉及exec、eval、compile三個函式。exec語句用來執行儲存在程式碼物件、字串、檔案中的Python語句,eval語句用來計算儲存在

perl的異常處理diewarneval函式--DBI的RaiseError

    在很多情況下,系統呼叫可能會失敗;例如,嘗試開啟不存在的檔案,或者刪除某個仍含有檔案的目錄,或者嘗試讀取沒有讀許可權的檔案。在前面的示例中,我們已經用到了die函式,本節將 詳細討論有關錯誤處理和錯誤處理函式的相關內容。這些函式包括die函式、warn函式和eval函式。 die函式用於在命令或檔案控

php的幾種輸出方式---echoprintprint_rdieexitprintf

echo echo可以輸出字串 echo 'aaa'; 輸出結果:aaa 也可以輸出變數 $m=5; echo $m; 輸出結果:5 也可以同時輸出多個字串的值,但是需要用逗號隔開 $m=5; echo 'aaa',$m;

[轉]Pythoneval()exec()及其相關函數

ron 1-1 代碼 project call s函數 錯誤 被調用 loader 剛好前些天有人提到eval()與exec()這兩個函數,所以就翻了下Python的文檔。這裏就來簡單說一下這兩個函數以及與它們相關的幾個函數,如gl

優化資料庫,將不同功能的表分別建立在不同的庫,儘量避免表的聯合查詢,重視索引

        對於大型網站最終資料庫將會是瓶頸,因為對於網站程式來說可以架構負載平衡,讓多個伺服器來分擔執行程式,但要讓多個伺服器同時操作一個數據庫是比較困難的,也因此最終會選擇把一個庫分成多個庫的方式來讓多臺伺服器分擔資料庫的壓力,所以我建議在最初就根據功能將表分開放在不

Js把JSON字串轉換為JSON物件(eval()new Function())

在我們利用js操作json資料時一般會用到eval進行資料轉換了,但有些朋友還喜歡使用function來轉換,下面我就給大家總結一下具體例子。 在JS中將JSON的字串解析成JSON資料格式,一般有兩種方式: 1.一種為使用eval()函式。 2. 使用Function物

PerlDBIDBD::mysql模組的安裝和可能出現的錯誤解決方法

使用的軟體版本 DBI-1.604.tar.gz DBD-mysql-4.006.tar.gz 建議使用以上版本搭配,否則可能連線mysql錯誤 一、DBI的安裝  wget http://www.cpan.org/modules/by-module/DBD/DBI-

Spring使用MapSetList數組屬性集合的註入方法配置文件

查看 main list highlight 配置 spring配置 pla lec while (1)下邊的一個Java類包含了所有Map、Set、List、數組、屬性集合等這些容器,主要用於演示spring的註入配置; [java] view plain c

JavaScript的callapplybind是怎麽回事?

ava 利用 參數 lock 們的 app scrip lac target 在JS中,這三者都是用來改變函數的this對象的指向的,他們有什麽樣的區別呢。在說區別之前還是先總結一下三者的相似之處:1、都是用來改變函數的this對象的指向的。2、第一個參數都是this要

關於Ubuntupasswdshadowgroup等文件

之間 文件的 最重要的 關聯 ice use 並不是 字段 新用戶 轉自https://yq.aliyun.com/articles/50327 在Ubuntu系統中,/etc目錄下,有三個文件:passwd shadow group,可能我們已經在用了,但是沒有註意到其詳

(轉)SQL的循環for循環遊標

from clas copy itl let alt 執行 循環 int 我們使用SQL語句處理數據時,可能會碰到一些需要循環遍歷某個表並對其進行相應的操作(添加、修改、刪除),這時我們就需要用到咱們在編程中常常用的for或foreach,但是在SQL中寫循環往往顯得那麽吃

C++11智能指針的原理使用實現

his animal something include expire another .cn 表現 oid 目錄 理解智能指針的原理 智能指針的使用 智能指針的設計和實現 1.智能指針的作用 C++程序設計中使用堆內存是非

GO_05_2:Golang panicrecoverdefer 的用法

log logs lan finall 可能 錯誤處理 錯誤 異常處理 auto 函數 defer   1. 它的執行方式類似其他語言中的折構函數,在函數體執行結束後按照調用順序的 相反順序 逐個執行   2. 即使函數發生 嚴重錯誤 也會被執行,類似於 java 中 t

ASP.NET的RequestResponseServer對象

.html languages asa 地址欄 判斷 nsf 一次 服務 tco Request對象 Response.Write(Request.ApplicationPath) //應用根路徑Request.AppRelativeCurrentExecutionFile

PLSQL的三種參數模式INOUTIN OUT

代碼 問題 ima .cn lang 傳遞 repl 一個 lin 1、IN模式 IN模式是參數的默認模式,這種模式就是在程序運行的時候已經具有值,在程序體中值不會改變。 錯誤例子: 1 create or replace procedure in_proc ( 2

Java的synchronizedvolatileReenTrantLockAtomicXXX

包含 指令 純粹 功能性 title 伸縮 其它 同步問題 留下 多線程和並發性並不是什麽新內容,但是 Java 語言設計中的創新之一就是,它是第一個直接把跨平臺線程模型和正規的內存模型集成到語言中的主流語言。核心類庫包含一個 Thread 類,可以用它來構建、啟動和操縱線

MyEclipse抽取接口父類

選項 cli src style eight 抽取 mage all bsp 選中要抽取接口的類-------->Refactor-------->Extact Interface-------->填寫抽取的接口名-------->選擇要抽取的方法