第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在Ruby中“拯救異常=>e”是不好的風格?

為什么在Ruby中“拯救異常=>e”是不好的風格?

哈士奇WWW 2019-06-10 16:54:13
為什么在Ruby中“拯救異常=>e”是不好的風格?賴安·戴維斯Ruby QuickRef說(沒有解釋):不要拯救例外。永遠不會。不然我就捅你。為什么不行?該怎么做才是對的?
查看完整描述

3 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

使用StandardError而不是一般的異常捕獲。當重新引發(fā)原始異常時(例如,當救援只記錄異常時),Exception可能沒問題。


ExceptionRuby異常層次結構所以當你rescue Exception你從一切,包括子類,如SyntaxErrorLoadError,和Interrupt.

援救Interrupt防止用戶使用克特C退出程序。

援救SignalException阻止程序正確響應信號。它將是無法殺死的,除非.kill -9.

援救SyntaxError意味著eval失敗的人會默默地這樣做。

所有這些都可以通過運行這個程序來顯示,并試圖克特Ckill它:

loop do
  begin
    sleep 1
    eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
  rescue Exception
    puts "I refuse to fail or be stopped!"
  endend

救出Exception甚至不是默認的。做

begin
  # iceberg!rescue
  # lifeboatsend

救不出Exception,它拯救了StandardError..您通常應該指定一些比默認值更具體的內容。StandardError,但是從Exception 變寬范圍而不是縮小它,可能會有災難性的結果,并使找蟲極其困難.


如果你遇到了什么情況,你真的想從StandardError如果您需要一個變量(除了這個例外),您可以使用以下形式:

begin
  # iceberg!rescue => e  # lifeboatsend

相當于:

begin
  # iceberg!rescue StandardError => e  # lifeboatsend

這是少數幾個正常的案例之一Exception用于日志記錄/報告,在這種情況下,您應該立即重新引發(fā)異常:

begin
  # iceberg?rescue Exception => e  # do some logging
  raise e  # not enough lifeboats ;)end


查看完整回答
反對 回復 2019-06-10
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

假設你在一輛車里(運行Ruby)。您最近安裝了一個帶有空中升級系統的新方向盤(該系統使用eval),但是您不知道有一個程序員在語法上搞砸了。

你在一座橋上,意識到你正向欄桿走一點,所以你向左拐。

def turn_left  self.turn left:end

哎呀!那可能是不好?,幸運的是,Ruby引發(fā)了一個SyntaxError.

車應該馬上停下來-對嗎?

沒有。

begin
  #...
  eval self.steering_wheel  #...rescue Exception => e  self.beep  self.log "Caught #{e}.", :
  warn  self.log "Logged Error - Continuing Process.", :infoend

嗶聲

警告:已捕獲SyntaxError異常。

信息:記錄錯誤-繼續(xù)處理。

你注意到有什么地方不對勁,你就在緊急情況下摔了一跤(^CInterrupt)

嗶聲

警告:捕獲中斷異常。

信息:記錄錯誤-繼續(xù)處理。

是啊-沒什么用。你離鐵軌很近,所以把車停在公園里kill英靈:SignalException).

嗶聲

警告:捕獲SignalException異常。

信息:記錄錯誤-繼續(xù)處理。

最后一秒鐘,你拿出鑰匙(kill -9),汽車停了下來,你猛地沖進方向盤(安全氣囊無法充氣,因為你沒有優(yōu)雅地停止程序-你終止了程序),而你車后部的電腦猛地撞到了它前面的座位上。一罐半罐可樂灑在報紙上。后面的雜貨都被壓碎了,而且大部分都是蛋黃和牛奶。這輛車需要認真的修理和清洗。(數據損失)

希望你有保險(備份)。哦,是的-因為氣囊沒有充氣,你可能受傷了(被解雇,等等)。


但是等等!有更多您可能想要使用的原因rescue Exception => e!

假設你是那輛車,你想確保安全氣囊膨脹,如果汽車超過了它的安全停車動量。

 begin 
    # do driving stuff
 rescue Exception => e    self.airbags.inflate if self.exceeding_safe_stopping_momentum?
    raise end

這里是規(guī)則的例外:你可以抓住Exception 只有當你重新引發(fā)異常的時候..所以,一個更好的規(guī)則就是不要吞下Exception,并且總是重提錯誤。

但是,在Ruby這樣的語言中,添加援救是很容易忘記的,而且在重新提出問題之前,將援救聲明放在這里感覺有點不枯燥。而你不要想忘記raise聲明。如果你這么做了,祝你好運,努力找出那個錯誤。

謝天謝地,Ruby很棒,您可以使用ensure關鍵字,確保代碼運行。這個ensure關鍵字將運行代碼,無論發(fā)生什么-如果拋出異常,如果沒有異常,唯一的例外是如果世界結束(或其他不可能發(fā)生的事件)。

 begin 
    # do driving stuff
 ensure
    self.airbags.inflate if self.exceeding_safe_stopping_momentum?
 end

砰!這段代碼無論如何都應該運行。你應該用的唯一理由rescue Exception => e是否需要訪問異常,或者只希望在異常上運行代碼。記得重提錯誤。每次。

注:正如@Niall所指出的,請確保跑啊。這是好的,因為有時您的程序可以欺騙您,而不是拋出異常,即使發(fā)生問題。對于關鍵的任務,如充氣安全氣囊,你需要確保它發(fā)生在任何情況下。因此,每次停車時檢查是否拋出異常都是個好主意。盡管充氣氣囊在大多數編程環(huán)境中是一項不常見的任務,但在大多數清理任務中,這實際上是相當常見的。

rescue Exception => e(而不是重新提出例外)-或者你強權開車離開橋。


查看完整回答
反對 回復 2019-06-10
  • 3 回答
  • 0 關注
  • 922 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號