Menu
CoddyTech

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;
challenge icon

Görev

Kolay

Alan 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)),
          ],
        ),
      ),
    );
  }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Flutter derleyicisi