try ile Hataları Yakalama
Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 10 / 27.
Ağ çağrısı başarısız olabilir: telefonun sinyali yoktur, sunucu çalışmıyordur ya da yol yanlıştır. fetch başarısız olduğunda bir hata fırlatır: api.dart dosyasının en üstünde bulunan, statusCode ve message içeren küçük bir sınıf olan ApiException. Kimsenin yakalamadığı bir hata, işlevinizi durdurur ve Console'da kırmızı bir hata olarak görünür; kişi de hiç bitmeyen bir yükleme simgesi görür.
Hatayı try ve catch ile yakalayın:
try {
final text = await fetch('/message');
// yalnızca fetch başarılı olduğunda çalışır
} catch (e) {
// yalnızca fetch bir hata fırlattığında çalışır
print('It failed: $e');
}Dart, try bloğunu çalıştırır. Bu bloğun içindeki herhangi bir şey hata fırlatırsa Dart doğrudan catch bloğuna geçer ve hata e içinde tutulur. try bloğunda hatanın oluştuğu satırdan sonraki satırlar hiçbir zaman çalışmaz.
await ifadesini try bloğunun içine koyun: hata fırlatan satır budur. Ardından çökmesine izin vermek yerine, ne olduğunu kişiye sözcüklerle açıklayın.
Ön izlemede hatayı görmek için main işlevinin ilk satırı olarak offline = true; yazıp Run'a basın. offline, api.dart dosyasından gelir: her çağrının, telefonun sinyali yokmuş gibi başarısız olmasını sağlar. Check'e basmadan önce bu satırı kaldırın.
Görev
OrtaloadMessage işlevinin başarısız bir çağrıdan etkilenmemesini sağla:
fetchçağrısını ve ardından gelensetStateçağrısını birtrybloğuna yerleştircatch (e)içinde dönen yükleme simgesini durdur ve mesajıCould not load: $eolarak ayarla
Kendin dene
import 'package:flutter/material.dart';
import 'api.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: MessageScreen(),
);
}
}
class MessageScreen extends StatefulWidget {
const MessageScreen({super.key});
@override
State<MessageScreen> createState() => _MessageScreenState();
}
class _MessageScreenState extends State<MessageScreen> {
String message = 'No message yet';
bool loading = false;
Future<void> loadMessage() async {
setState(() {
loading = true;
});
final text = await fetch('/message');
setState(() {
message = text;
loading = false;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
loading
? const CircularProgressIndicator()
: Text(message, style: const TextStyle(fontSize: 24)),
const SizedBox(height: 24),
ElevatedButton(onPressed: loadMessage, child: const Text('Load message')),
],
),
),
);
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Veri ve Ağ bölümündeki tüm dersler
3Çağrılar Başarısız Olduğunda
try ile Hataları YakalamaHata Fırlatmafinally ile TemizlemeFutureBuilder Hata DurumuYeniden Dene DüğmesiKendi başına pratik yap: Online Flutter derleyicisi