ファイルを読むのに次のようなコードを書いてpathに""(空文字列)を渡したら、readAsString()で例外を起こしたがキャッチされずにアプリが落ちた。
Future<void> readFile(String path) async {
try {
final file = File(path);
final content = await file.readAsString();
...
} catch (e, stackTrace) {
print("Error reading file: $e");
Copilotにどーゆーこっちゃと聞いたら、path が空文字列("")だと File("") となり、
カレントディレクトリを指してしまう。ディレクトリに対して readAsString() を呼ぶと、FileSystemException ではなく別の例外(IsADirectoryError など)が発生し、catchできない場合があるのだそーな。
File()にフルパスでない文字列を渡すとカレントディレクトリからの相対指定となる。空文字だとカレントディレクトリそのものを指すという理屈であろう。こっちはまあ納得できるが、ディレクトリに対してreadAsString()を呼ぶとcatchできないというのは困る。さらにCopilotにいろいろ聞いてみたが、Copilotがこーやったらcatchできると出してきた案はことごとく失敗した。
しかたがないので今のところ対策は実行前に空文字かどうか判定するということになる。これでもpathが存在するディレクトリだったら落ちてしまうかもしれないが、存在しないファイルを指定すると例外をcatchすることができた。
Future<void> readFile(String path) async {
if (path.isEmpty) {
return;
}
try {
final file = File(path);
final content = await file.readAsString();
...