2012-09-18 54 views
1

在Bash中,有什麼方法可以模擬異常嗎?在bash中模擬異常類似bevaviour

E.g.在測試功能,我有幾個測試語句

test_foo_and_bar() { 
    expect_foo $1 
    expect_bar $2 
} 

expect_foo() { 
    [[ $1 != "foo" ]] && return 1 
} 

expect_bar() { 
    [[ $1 != "bar" ]] && return 1 
} 

現在,我想的是,如果expect_foo失敗,將停止執行,並返回的功能test_foo_and_bar調用者。

是這樣的可能嗎?我知道你可以這樣做:

test_foo_and_bar() { 
    expect_foo $1 || return 2 
    expect_bar $2 || return 2 
} 

但我對替代解決方案感興趣(如果有的話)。

編輯

而提出的解決方案是相當不錯的,我有一個進一步的要求。 異常發生後,我仍然需要執行清理。所以退出不是一種選擇。

我用java說的有效需要的是某種finally子句。

+1

在sh中獲得異常類行爲的標準方法是使用'set -e'。有關詳細信息,請參閱http://stackoverflow.com/a/12337030/1600898。 – user4815162342

回答

1

是在我腦海中快速的黑客是使用subshel​​ling和exit

test_foo_and_bar() { 
    (
     expect_foo $1 
     expect_bar $2 
    ) 
} 

expect_foo() { 
    [[ $1 != "foo" ]] && exit 1 
} 

expect_bar() { 
    [[ $1 != "bar" ]] && exit 1 
} 

這樣,任何故障都會導致整個test_foo_and_bar塊終止。但是,您必須始終記得在子外殼中調用expect_foo_bar以避免終止主程序。

此外,您可能需要用自定義die函數替換exit,該函數還會輸出一些詳細錯誤。

+0

當'set -e/+ e'設置在適當的地方時,可以避免一些'&& exit 1'? – Jens

+0

是的,當然 - 只要你不想要特定的失敗信息。但是,您應該知道確切的'set -e'語義(即哪些事物實際退出,哪些不會)。這有點嚇人,有時遠不是顯而易見的(特別是用&&和'||'),所以我會親自避免這種情況。 –

+1

另外,在子shell中調用的函數不能再影響當前的shell,因此這個方案可以使用哪些函數有限制。 – chepner