Hata Fırlatma
Coddy'nin Flutter Journey'sinin Veri ve Ağ bölümünün bir parçası. Ders 11 / 27.
Hatalar yalnızca sunucular için değildir. Kendi işlevlerin de devam etmeyi reddedebilir. Bir işlev, üzerinde çalışamayacağı bir şey aldığında hata fırlatır:
Future<void> saveName(String name) async {
if (name.isEmpty) {
throw Exception('The name cannot be empty');
}
// adı kaydet
}throw, return gibi işlevi olduğu yerde durdurur, ancak bir değer yerine hata döndürür. Exception('...'), neyin yanlış gittiğini açıklayan bir mesaj içeren hatadır.
İşlevi çağıran kişi, tıpkı fetch'ten gelen bir hatada olduğu gibi, hatayı try ve catch ile yakalar. Metne dönüştürüldüğünde, bir Exception önce Exception: ile başlar, ardından mesajın gelir.
Gerçek bir fetch de böyle çalışır. Sunucudan gelen her yanıt bir durum koduyla birlikte gelir: 200 OK anlamına gelir, 404 bulunamadı anlamına gelir. Kodun 200 olmadığı durumlarda, kodun hata fırlatır; böylece ekran bozuk bir yanıtı veriymiş gibi göstermez:
final response = await http.get(Uri.parse(url));
if (response.statusCode != 200) {
throw Exception('The server answered ${response.statusCode}');
}
return response.body;Görev
KolayAlan boşken Save düğmesine dokun: ad olmadan Saved: yazısını gösterir. saveName işlevinin boş bir adı kabul etmemesini sağla: beklemeden sonra, name boşsa Exception('The name cannot be empty') hatasını fırlat. save işlevi hatayı zaten yakalıyor ve mesajı gösteriyor.
Kendin dene
import 'package:flutter/material.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: NameScreen(),
);
}
}
class NameScreen extends StatefulWidget {
const NameScreen({super.key});
@override
State<NameScreen> createState() => _NameScreenState();
}
class _NameScreenState extends State<NameScreen> {
final controller = TextEditingController();
String status = '';
@override
void dispose() {
controller.dispose();
super.dispose();
}
Future<void> saveName(String name) async {
await Future.delayed(const Duration(seconds: 1));
}
Future<void> save() async {
try {
await saveName(controller.text);
setState(() {
status = 'Saved: ${controller.text}';
});
} catch (e) {
setState(() {
status = '$e';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: controller,
decoration: const InputDecoration(labelText: 'Name'),
),
const SizedBox(height: 16),
ElevatedButton(onPressed: save, child: const Text('Save')),
const SizedBox(height: 16),
Text(status, style: const TextStyle(fontSize: 18)),
],
),
),
);
}
}
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