2012-02-28 13 views
7

Czy istnieje sposób dostępu do wartości val utworzonej w bloku try/catch w bloku finally? lub jest w końcu blokiem poza zakresem.Jest wreszcie "poza zakresem" w bloku prób/catch

def myTryCatch: Either[Exception, String] = { 
    try { 
    val w = runOrFailWithException("Please work...") 
    Right(w) 
    } catch { 
    case ex: Exception => { 
     Left(ex) 
    } 
    } 
    finally { 
    // How do I get access to Left or Right in my finally block. 
    // This does not work 
    _ match { 
     case Right(_) => 
     case Left(_) => 
    } 
    } 
} 
+1

nie, wreszcie widzi tylko rzeczy zadeklarowana poza zakresem try/catch, a nie wewnątrz niego. –

Odpowiedz

12

Dlaczego trzeba to zrobić w bloku finally? Ponieważ try/catch jest wyrazem, można dopasować jego wartości:

try { 
    val w = runOrFailWithException("Please work...") 
    Right(w) 
} catch { 
    case ex: Exception => Left(ex) 
} match { 
    case Right(_) => 
    case Left(_) => 
} 
+0

Dziękuję, to działa bardzo dobrze. Oczywiście nie potrzebuję tutaj "w końcu". - Java wciąż jest gdzieś z tyłu mojej głowy. –

+1

Właściwie to zdarzenie nie potrzebujesz dopasowania;) po prostu rób to, co chcesz z wartościami wewnątrz klauzul "próbuj i złap", a następnie "zwróć" je) – tuxSlayer

+0

Jeśli Java wciąż znajduje się w tyle twojej głowy, musisz wiedzieć, że zasady zasięgu próbują ..catch..finally są takie same w Javie. –

Powiązane problemy