2014-01-14 54 views
3

我在我的應用程序是這樣的鴻溝:現在斯卡拉:由零

def something(x: Int, y: Int) Z { 

    (x/y) 
} 

,如果someval不是數字(意思是X或Y等於0),那麼我會像Z到剛剛成爲0,而不是顯示錯誤([ArithmeticException: Division by zero]

我知道我可以做:

Try(someVale) orElse Try(0) 

然而,這會給我Success(0)而我只是喜歡它給我一個0123在這種情況下爲。

也許在Scala中有類似if ArithmeticException then 0的東西或刪除「成功」和括號。有人可以請一些光嗎?

+0

以防萬一:它只是不可避免的異常或問題的一個例子是字面上的「鴻溝通過零「? – senia

回答

10

我假設「除以零」只是一個例子,你不能避免拋出異常。當你可以避免拋出異常時,你應該像this answer那樣做。

你可以對Try代替orElse使用getOrElse方法:

def something(x: Int, y: Int) = Try(x/y).getOrElse(0) 

如果你只想在ArithmeticException恢復你可以使用recover方法和get

def something(x: Int, y: Int) = 
    Try(x/y).recover{ case _: ArithmeticException => 0 }.get 

有了方法get你如果Try的值爲Failure,會得到一個例外,但recover可以讓您將Failure轉換爲Success

您也可以將您的TryOption返回「無結果」沒有表現出異常:

def something(x: Int, y: Int): Option[Int] = Try(x/y).toOption 
3

剛剛捕獲異常,並返回0是最簡單的方法。

def something(x: Int, y: Int) = try { 
    (x/y) 
    } catch { 
    case ae: java.lang.ArithmeticException => 0 
    } 

運行:

scala> something(1,0) 
res0: Int = 0 

scala> something(2,1) 
res1: Int = 2 
+1

由於'ae'沒有被使用,所以'case _:Arithm ...'我也會失去外部支撐和支撐... –

9

我想我會期待:

def something(x: Int, y:Int) = if (y != 0) x/y else 0 
+0

+1 - 這是唯一合理的答案。用大量額外的機器和巨大的運行時間成本來捕捉算術異常,而不是執行一個簡單的條件就是瘋狂! –