例外はチェックされ、チェックされない
つまり、ポジティブシナリオ(すべてが順調に進んでいる場合)とネガティブシナリオ(エラーが発生してポジティブシナリオが中断された場合)を区別するには、例外が必要です。これは、エラーを処理するための情報がコードにほとんどなく、上記で何が起こったかについての情報を伝える必要があるため、便利です。
たとえば、ファイルから数値を読み取るための関数があります(または数値ではなく、問題ではありません)。
String readStoredData(String id) throws FileNotFoundException, IOException {
File file = new File(storage, id + ".dat");
try (BufferedReader in = new BufferedReader(new FileReader(file))) {
return in.readLine();
}
}
ご覧のとおり、エラーが発生した場合の対処方法を決定するコードはここにはありません。そして、何をすべきかが明確ではありません-プログラムを終了し、 ""、nullまたは他の何かを返しますか?したがって、例外はで宣言さthrows
れ、呼び出し元のどこかで処理されます。
int initCounter(String name) throws IOException, NumberFormatException {
try {
return Integer.parseInt(readStoredData(name));
} catch (FileNotFoundException e) {
return 0;
}
}
Javaの例外は、チェックされているものとチェックされていないものに分けられます。この場合、IOException
チェックされます。宣言してthrows
からどこかで処理する必要があります。コンパイラがチェックします。NumberFormatException
検証不可能-その処理はプログラマーの良心にとどまり、コンパイラーはあなたを制御しません。
3番目のタイプの例外である致命的なエラー(Error
)もありますが、通常は処理する意味がないため、心配する必要はありません。
, – , .
:
;
( – ) .
- , . .
Scala?
Scala: ( ), .
Try[T]
– , , . Scala:
def readStoredData(id: String): Try[String] =
Try {
val file = new File(storage, s"$id.dat")
val source = Source.fromFile(file)
try source.getLines().next()
finally source.close()
}
def initCounter(name: String): Try[Int] = {
readStoredData(name)
.map(_.toInt)
.recover {
case _: FileNotFoundException => 0
}
}
, , readStoredData
String
, Try[String]
– . Try Java – , .
:
(
Either[Error, T]
, );
happy-path , (
Try/get
for/map/flatMap
);
Java - , ( Java , ).
( Try[String]
– ). Option[T]
– , Future[T]
– ..
, – . / Java, ( ).
:
FileNotFoundException
,
IOException
–
:
def readStoredData(id: String): Option[Try[String]] = {
val file = new File(storage, s"$id.dat")
if (file.exists()) Some(
Try {
val source = Source.fromFile(file)
try source.getLines().next()
finally source.close()
}
)
else None
}
Option[Try[String]]
, , :
None
–
Some(Success(string))
–
Some(Failure(exception))
– ,
Try
. Java , null. .
種類が豊富なため、視覚的なノイズが多くなり、同時に複数のエフェクトを操作する場合は、より複雑なコードが必要になることがよくあります。しかし、その見返りとして、自己文書化コードを提供し、コンパイラーが多くのエラーを検出できるようにします。