成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[原] 深入對(duì)比數(shù)據(jù)科學(xué)工具箱:Python 和 R 的異常處理機(jī)制

FreeZinG / 892人閱讀

摘要:對(duì)于異常機(jī)制的合理運(yùn)用是直接關(guān)系到碼農(nóng)飯碗的事情所以,本文將具體介紹一下和的異常處理機(jī)制,闡明二者在異常處理機(jī)制上的異同。下面將具體介紹二者的異常處理機(jī)制。

概述

異常處理,是編程語言或計(jì)算機(jī)硬件里的一種機(jī)制,用于處理軟件或信息系統(tǒng)中出現(xiàn)的異常狀況(即超出程序正常執(zhí)行流程的某些特殊條件)。Python和R作為一門編程語言自然也是有各自的異常處理機(jī)制的,異常處理機(jī)制在代碼編寫中扮演著非常關(guān)鍵的角色,卻又是許多人容易混淆的地方。對(duì)于異常機(jī)制的合理運(yùn)用是直接關(guān)系到碼農(nóng)飯碗的事情!所以,本文將具體介紹一下Python和R的異常處理機(jī)制,闡明二者在異常處理機(jī)制上的異同。

異常安全

在了解Python和R的異常機(jī)制之前,我們有必要了解一下異常安全的概念。

根據(jù)WikiPedia的文獻(xiàn),一段代碼是異常安全的,如果這段代碼運(yùn)行時(shí)的失敗不會(huì)產(chǎn)生有害后果,如內(nèi)存泄露、存儲(chǔ)數(shù)據(jù)混淆、或無效的輸出。我們可以知道一段代碼的異常安全通常分為下面五類:

異常安全通常分為5個(gè)層次:

失敗透明:如果出現(xiàn)了異常,將不會(huì)對(duì)外進(jìn)一步拋出該異常。(一般比較復(fù)雜)

強(qiáng)異常安全:可以運(yùn)行失敗,不過數(shù)據(jù)會(huì)回滾到代碼運(yùn)行前(無副作用)

基本異常安全:運(yùn)行失敗導(dǎo)致的數(shù)據(jù)變更,使得代碼運(yùn)行前后數(shù)據(jù)不一致了(有副作用)

最小異常安全:運(yùn)行失敗保存了無效數(shù)據(jù),但是還不會(huì)引起崩潰,資源不會(huì)泄露(進(jìn)程不會(huì)掛)

異常不安全:沒有任何保證(進(jìn)程可能會(huì)掛掉)

從上述的5個(gè)層次來看,我們可以知道,在平時(shí)寫代碼的時(shí)候,對(duì)數(shù)據(jù)庫、文件、網(wǎng)絡(luò)等的IO操作都是需要盡量保證無副作用的,也就是強(qiáng)異常安全。具體來說就是,RDBS操作在失敗的時(shí)候需要回滾機(jī)制、所有IO操作在最后要保證IO連接資源關(guān)閉。

其實(shí)和多數(shù)語言的異常機(jī)制的語法是類似的:Python和R都是通過拋出一個(gè)異常對(duì)象或一個(gè)枚舉類的值來返回一個(gè)異常;異常處理代碼的作用域由try開始,以第一個(gè)異常處理子句(catch, except等)結(jié)束;可連續(xù)出現(xiàn)若干個(gè)異常處理子句,每個(gè)處理特定類型的異常。最后通過finally子句,無論是否出現(xiàn)異常它都將執(zhí)行,用于釋放異常處理所需的一些資源。

下面將具體介紹二者的異常處理機(jī)制。

Python 中的異常處理機(jī)制

首先,Python 是一門面向?qū)ο笳Z言,所有的異常類都是通過繼承BaseException類來實(shí)現(xiàn)的,我們亦可以通過相應(yīng)的繼承來實(shí)現(xiàn)自定義的異常類,比如在工作流調(diào)度中使用AirflowException,具體實(shí)現(xiàn)可以直接看Airflow的源碼。

事實(shí)上,這些在我們代碼處理范圍內(nèi)的異常其實(shí)就是可以分成兩個(gè)部分:

IO異常:由網(wǎng)絡(luò)抖動(dòng)、磁盤文件位置變更、數(shù)據(jù)庫連接變更等引起的IO異常問題。

運(yùn)行期異常:由于計(jì)算或者傳輸?shù)膮?shù)參數(shù)類型有誤、參數(shù)值異常等等發(fā)生在運(yùn)行期的異常,都統(tǒng)一被稱為運(yùn)行期異常。正常來說,IO上的異常我們都要有相應(yīng)的try-catch-finally機(jī)制,在Python也就是如下實(shí)現(xiàn):

try:
   do something with IO
except:
   do something without IO
finally:
   close IO

這里容易犯的一個(gè)錯(cuò)誤就是在except中又引入了新的IO操作,比如在except中又引入了一個(gè)API的POST請(qǐng)求或者數(shù)據(jù)庫寫操作等等,這樣如果在except階段又發(fā)生了異常,將導(dǎo)致異常信息的丟失。

另一方面,對(duì)于可能的運(yùn)行期異常則需要我們根據(jù)具體應(yīng)用場(chǎng)景的需求來做相應(yīng)的處理,一般就是遇到一個(gè)新的問題加一個(gè)新的異常捕獲機(jī)制,當(dāng)然這里也就考驗(yàn)到碼農(nóng)程序設(shè)計(jì)的功利,是否能夠未雨綢繆。比如數(shù)組長度的檢查,傳入字典的Key檢查等等。Python本身提供了豐富的異常處理類型并且易于拓展,正確使用將可以顯著提升程序的魯棒性(保住碼農(nóng)的飯碗)。

使用try-catch-finally機(jī)制是足夠簡(jiǎn)單的,但是在混入returnrasie操作之后,事情就看起來變得有點(diǎn)復(fù)雜。

舉一個(gè)例子:

def test():
    try:
        a = 1/0
    except:
        a = 0
        raise(ValueError,"value error, the division must greater than 0")
        return a
    finally:
        a = 1
        return a
test()

你看這里的返回應(yīng)該是什么呢?

其實(shí),這里的返回最后應(yīng)該是 1,而except中raise的異常則會(huì)被吃掉。這也是許多人錯(cuò)誤使用finanlly的一個(gè)很好的例子。

Python在執(zhí)行帶有fianlly的子句時(shí)會(huì)將except內(nèi)拋出的對(duì)象先緩存起來,優(yōu)先執(zhí)行finally中拋出的對(duì)象,如果finally中先拋出了return或者raise,那么except段拋出的對(duì)象將看起來被吃掉了。

一個(gè)段正確的處理方式應(yīng)該是這樣的:

try:
    do IO
    info = {"status":200}
except:
    info = {"status":400}
finally:
    try:
        write log(info)
    except:
        raise(SomeError,"error message")
    close IO

具體的調(diào)用棧的過程可以參考這個(gè)更加生動(dòng)的例子:

R 中的異常處理機(jī)制

R和Python最大的不同就是 R 本質(zhì)上是一門強(qiáng)動(dòng)態(tài)類型的非純函數(shù)式編程語言(所謂非純即存在副作用)而非面向?qū)ο笳Z言。從函數(shù)式編程語言的角度上講,R和Erlang、LISP的關(guān)系比較近一些。

既然是函數(shù)式語言,處理異常也是通過函數(shù)式的,而非直接通過面向?qū)ο蟮姆绞健 從語法上來看就略顯突兀(花括號(hào)函數(shù)式語言的一大通病):

tryCatch({
  doStuff()
  doMoreStuff()
}, some_exception = function(se) {
  recover(se)
})

如果這段用Python來表達(dá)就變成:

try:
  doStuff()
  doMoreStuff()
except SomeException, se:
  recover(se)

事實(shí)上正確運(yùn)用 R 的異常處理機(jī)制反而是比較負(fù)擔(dān)小的一種方式:(R 還支持用中文字符集命名變量)

tryCatch({
  結(jié)果 <- 表達(dá)式
}, warning = function(w) {
    warning()
  ... # 運(yùn)行期異常
}, error = function(e) {
    stop()
  ... # IO異常
}, finally {
    on.exit()
  ... # 資源回收
}

下面是 Hadley 大神對(duì)R的異常處理機(jī)制優(yōu)點(diǎn)的分析:

One of R’s great features is its condition system. It serves a similar purpose to the exception handling systems in Java, Python, and C++ but is more flexible. In fact, its flexibility extends beyond error handling–conditions are more general than exceptions in that a condition can represent any occurrence during a program’s execution that may be of interest to code at different levels on the call stack. For example, in the section “Other Uses for Conditions,” you’ll see that conditions can be used to emit warnings without disrupting execution of the code that emits the warning while allowing code higher on the call stack to control whether the warning message is printed. For the time being, however, I’ll focus on error handling.

The condition system is more flexible than exception systems because instead of providing a two-part division between the code that signals an error and the code that handles it, the condition system splits the responsibilities into three parts–signaling a condition, handling it, and restarting. In this chapter, I’ll describe how you could use conditions in part of a hypothetical application for analyzing log files. You’ll see how you could use the condition system to allow a low-level function to detect a problem while parsing a log file and signal an error, to allow mid-level code to provide several possible ways of recovering from such an error, and to allow code at the highest level of the application to define a policy for choosing which recovery strategy to use.

我的理解是R通過條件機(jī)制,然我們可以選擇性的在低階函數(shù)中把warning吃掉,這樣就不至于影響高階函數(shù)的運(yùn)行?條件機(jī)制將異常分為三階段而不是兩階段:

1.異常信號(hào)捕獲
2.異常處理
3.重啟機(jī)制。

并且我們還可以看到在異常處理中,如何在中階函數(shù)中恢復(fù)低階函數(shù)的Error,并且在高階函數(shù)中選擇一定的恢復(fù)策略。

這段貌似個(gè)人理解有誤,還請(qǐng)看官指正。

參考資料

RCpp的異常處理

Python對(duì)API調(diào)用的異常封裝例子

什么情況下使用異常處理?

知乎:Python 的異常機(jī)制及規(guī)范是否相當(dāng)不人性化?

Python Exceptions Handling

Using R — Basic error Handing with tryCatch()

博客園:R語言里的異常處理與錯(cuò)誤控制

Error Handling in R

Beyond Exception Handling: Conditions and Restarts

R 錯(cuò)誤處理

Stackoverflow: Exception handling in R

CRAN: Exception Handling in R

R 語言摘記(R-LANG, PART II)

Java異常處理

更優(yōu)閱讀體驗(yàn)可直接訪問原文地址:https://segmentfault.com/a/11...
作為分享主義者(sharism),本人所有互聯(lián)網(wǎng)發(fā)布的圖文均遵從CC版權(quán),轉(zhuǎn)載請(qǐng)保留作者信息并注明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog...,如果涉及源代碼請(qǐng)注明GitHub地址:https://github.com/harryprince。微信號(hào): harryzhustudio
商業(yè)使用請(qǐng)聯(lián)系作者。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38098.html

相關(guān)文章

  • []深入對(duì)比數(shù)據(jù)科學(xué)具箱PythonR Web 編輯器

    摘要:概述工欲善其事必先利其器,如果現(xiàn)在要評(píng)選數(shù)據(jù)科學(xué)中最好用的編輯器注意一定是可以通過訪問的,和一定是角逐的最大熱門,正確使用編輯器可以很大地提升我們的工作效率。 概述 showImg(https://segmentfault.com/img/bVAdol); 工欲善其事必先利其器,如果現(xiàn)在要評(píng)選數(shù)據(jù)科學(xué)中最好用的Web 編輯器(注意一定是可以通過Web訪問的),RStudio和Jupyt...

    RobinQu 評(píng)論0 收藏0
  • []深入對(duì)比數(shù)據(jù)科學(xué)具箱PythonR 非結(jié)構(gòu)化數(shù)據(jù)結(jié)構(gòu)化

    摘要:則在讀取數(shù)據(jù)時(shí)將兩個(gè)中文字段混淆成了一個(gè)字段,導(dǎo)致整個(gè)數(shù)據(jù)結(jié)構(gòu)錯(cuò)亂。三條路子全軍覆沒,這讓我情何以堪,好在使用的經(jīng)驗(yàn)頗豐,通過中文的轉(zhuǎn)換和切割就輕松解決了這個(gè)問題。 概述 showImg(https://segmentfault.com/img/bVylLL); 在現(xiàn)實(shí)場(chǎng)景中,由于數(shù)據(jù)來源的異構(gòu),數(shù)據(jù)源的格式往往是難以統(tǒng)一的,這就導(dǎo)致大量具有價(jià)值的數(shù)據(jù)通常是以非結(jié)構(gòu)化的形式聚合在一起的...

    leiyi 評(píng)論0 收藏0
  • []深入對(duì)比數(shù)據(jù)科學(xué)具箱PythonR之爭(zhēng)[2016版]

    摘要:概述在真實(shí)的數(shù)據(jù)科學(xué)世界里,我們會(huì)有兩個(gè)極端,一個(gè)是業(yè)務(wù),一個(gè)是工程。偏向業(yè)務(wù)的數(shù)據(jù)科學(xué)被稱為數(shù)據(jù)分析,也就是型數(shù)據(jù)科學(xué)。所以說,同時(shí)學(xué)會(huì)和這兩把刷子才是數(shù)據(jù)科學(xué)的王道。 showImg(https://segmentfault.com/img/bVAgki?w=980&h=596); 概述 在真實(shí)的數(shù)據(jù)科學(xué)世界里,我們會(huì)有兩個(gè)極端,一個(gè)是業(yè)務(wù),一個(gè)是工程。偏向業(yè)務(wù)的數(shù)據(jù)科學(xué)被稱為數(shù)據(jù)...

    whidy 評(píng)論0 收藏0
  • [譯] 深入對(duì)比數(shù)據(jù)科學(xué)具箱Python R C/C++ 實(shí)現(xiàn)

    摘要:另外一個(gè)我們同時(shí)使用兩種語言的原因是已有的統(tǒng)計(jì)學(xué)工具與包。對(duì)另一些為讀者寫數(shù)據(jù)科學(xué)工具的人來說他們從一開始就考慮了這些跨語言。和實(shí)際上是用實(shí)現(xiàn)的這是條阻力最小的路徑。無論是哪個(gè)贏得這場(chǎng)語言戰(zhàn)爭(zhēng),和都將保持在數(shù)據(jù)科學(xué)屆的地位。 showImg(https://segmentfault.com/img/remote/1460000006762469); 概述 幾周前,我有幸在 Scipy ...

    jimhs 評(píng)論0 收藏0
  • [] 容器定義應(yīng)用:數(shù)據(jù)科學(xué)容器革命

    摘要:概述隨著容器化技術(shù)的興起,數(shù)據(jù)科學(xué)現(xiàn)在最大的一場(chǎng)運(yùn)動(dòng)已經(jīng)不是由一個(gè)新的算法或者統(tǒng)計(jì)方法發(fā)起的了,而是來自的容器化技術(shù)。本文將介紹利用容器技術(shù)如何加速數(shù)據(jù)科學(xué)在生產(chǎn)環(huán)境中的實(shí)際應(yīng)用。 showImg(https://segmentfault.com//img/bVxzYL); 概述 隨著容器化技術(shù)的興起,數(shù)據(jù)科學(xué)現(xiàn)在最大的一場(chǎng)運(yùn)動(dòng)已經(jīng)不是由一個(gè)新的算法或者統(tǒng)計(jì)方法發(fā)起的了,而是來自Doc...

    alin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<