Hata yönetimi
- C++ kursu
- Başlangıç
- Ders 115/116
- 6 dk
try/catch ile girdi doğrulama ve hata yönetimi eklersin.
Özel istisna ile doğrulama
Bu derste addTask işlevine bir doğrulama ekleyeceğiz. Başlık boşsa InvalidTaskException istisnası fırlatılacak; çağıran kod bunu try/catch ile yakalayıp kullanıcıya mesaj gösterecek.
InvalidTaskException, std::exception'dan türetilmiş bir sınıftır; what() metodunu geçersiz kılarak özel mesaj döndürür. Bu sayede program, geçersiz girişlerde çökmeden uygun bir yanıt verebilir.
try/catch ile yakalama
addTask çağrısını try bloğuna alırsın; istisna fırlatıldığında catch bloğu çalışır. catch (const InvalidTaskException& e) biçiminde yakalanan istisnanın mesajına e.what() ile erişilir.
try {
addTask(tasks, "", "bekliyor");
} catch (const InvalidTaskException& e) {
cout << e.what();
}Burada boş başlık InvalidTaskException fırlatır; catch bunu yakalayıp mesajı yazdırır. Program çökmeden yoluna devam eder. Bu desen, kullanıcı girişi doğrulamanın standart yoludur.
Uygulama InvalidTaskException sınıfı ekle
class InvalidTaskException : public std::exception tanımla; public: bloğunda const char* what() const noexcept override { return "geçersiz görev"; } yaz. addTask işlevinin başına if (title.empty()) throw InvalidTaskException(); ekle. main içinde printMenu(); çağrısından sonra try { addTask(tasks, "Ödev", "bekliyor"); addTask(tasks, "", "bekliyor"); } catch (const InvalidTaskException& e) { cout << e.what() << endl; } ve en son listTasks(tasks); çağrısı ekle.
Başlangıç kodu
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
using namespace std;
struct Task {
string title;
string status;
};
// InvalidTaskException sınıfını tanımla
void printMenu() {
cout << "1 - Ekle" << endl;
cout << "2 - Listele" << endl;
cout << "3 - Çıkış" << endl;
}
void addTask(vector<Task>& tasks, string title, string status) {
// boş başlık için throw ekle
Task t;
t.title = title;
t.status = status;
tasks.push_back(t);
}
void listTasks(const vector<Task>& tasks) {
for (Task t : tasks) {
cout << t.title << " - " << t.status << endl;
}
}
int main() {
printMenu();
vector<Task> tasks;
// try/catch ile addTask çağrısı ve listTasks ekle
return 0;
}Örnek çözüm
#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>
using namespace std;
struct Task {
string title;
string status;
};
class InvalidTaskException : public std::exception {
public:
const char* what() const noexcept override {
return "geçersiz görev";
}
};
void printMenu() {
cout << "1 - Ekle" << endl;
cout << "2 - Listele" << endl;
cout << "3 - Çıkış" << endl;
}
void addTask(vector<Task>& tasks, string title, string status) {
if (title.empty()) throw InvalidTaskException();
Task t;
t.title = title;
t.status = status;
tasks.push_back(t);
}
void listTasks(const vector<Task>& tasks) {
for (Task t : tasks) {
cout << t.title << " - " << t.status << endl;
}
}
int main() {
printMenu();
vector<Task> tasks;
try {
addTask(tasks, "Ödev", "bekliyor");
addTask(tasks, "", "bekliyor");
} catch (const InvalidTaskException& e) {
cout << e.what() << endl;
}
listTasks(tasks);
return 0;
}Beklenen çıktı
1 - Ekle 2 - Listele 3 - Çıkış geçersiz görev Ödev - bekliyor
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Boşluğu doldur: throw çağrısı
if (title.empty()) {
____ InvalidTaskException();
}
if (title.empty()) {
throw InvalidTaskException();
}
Açıklama: throw ile istisna fırlatılır.
2 addTask'ta boş başlık nasıl bildirilir?
- Program çöker
- 0 döndürür
- Yoksayar
- InvalidTaskException fırlatır Doğru cevap
Açıklama: Boş başlıkta InvalidTaskException fırlatılır.
3 Bloğu göreviyle eşleştir
| Kavram | Anlamı |
|---|---|
try |
addTask çağrısı |
throw |
istisna fırlatır |
catch |
mesajı yazdırır |