2016-08-03 2 views
1
try{ 
    throwsException(); 
} catch { 
    case e: IOException => println("IO Exception"); 
} finally { 
    println("this code is always executed"); 
} 

В разделе catch , она всегда появляется «выражение типа блока не подтвердить тип String» ошибка.Scala Выражение типа блока не подтверждает ввести строку

+3

есть, вероятно, некоторые недостающее контекст здесь - выглядит, как этот код является органом функции/блока, которая возвращает 'String', а в случае исключения - нет - можете ли вы добавить код, инкапсулирующий этот фрагмент? –

+0

Возможно, вы можете попробовать сделать что-то вроде этого catch {case e: IOException => e.getMessage}. В основном функция ur ожидает String, но вы ничего не возвращаете – Rakshith

ответ

3

Похоже, что этот код является частью более крупного блока, который должен оцениваться как String. Например, мы можем рассмотреть следующие,

def getStringResult(): String = { 
    try{ 
    throwsException(); 
    } catch { 
    case e: IOException => println("IO Exception"); 
    } finally { 
    println("this code is always executed"); 
    } 
} 

Теперь вы можете видеть, что в случае исключения вы предоставляете { case e: IOException => println("IO Exception") }, которая является частичной функцией типа IOException => Unit. И это приводит к несоответствию типов.

Вы можете решить эту проблему, как следующие,

def getStringResult(): String = { 
    try{ 
    throwsException(); 
    } catch { 
    case e: IOException => "IOException String" 
    } 
} 

Или вы можете сделать более Scala-как ПОДХОД,

def getStringResult(): String = { 
    val resultTry = Try(throwsException()) 
    // resultTry will be of type Try[String] 

    resultTry.getOrElse("String in case of exception") 
} 
Смежные вопросы