2013-04-03 11 views
5

Mój program jest następujący: (na linux)Exception Handling w C++ przez rzucanie ciąg

// Ex. 2 of Exception Handling 
// Here divn() raises the exception but main() will be the exception handler 

#include<iostream> 
using namespace std; 

int divn(int n, int d) 
{ 
    if(d == 0) 
     throw "Division by ZERO not possible "; 

    return n/d; 
} 

main() 
{ 
    int numer, denom; 
    cout << "Enter the numerator and denominator : "; 
    cin >> numer >> denom; 
    try 
    { 
     cout << numer << "/" << denom << " = " << divn(numer,denom) << endl; 
    } 
    catch(char *msg) 
    { 
     cout << msg; 
    } 
    cout << "\nEnd of main() \n "; 
} 

/* powinno rzucać wyjątek i zapewnić dany komunikat o błędzie, gdy stawiamy mianownika jako 0. wyjście I dostać kiedy wprowadzić denom jako 0 jest następujący:

administrator @ ubuntu: ~/FYMCA/CPP_class $ g ++ prog110.cpp administrator @ ubuntu: ~/FYMCA/CPP_class $ ./a.out Wprowadź licznik i mianownik: 12 0 kończy się wywołanie po rzuceniu instancji 'char const *' Przerwano (zrzucono rdzeń)

Jak mogę rozwiązać problem?

Odpowiedz

1

Nie należy rzucać wyjątkami w taki sposób. Dobrą praktyką jest przy użyciu standardowych wyjątków w stdexcept lib, takich jak std :: runtime_error lub błędów std :: logicznego lub tworząc swoją własną klasę wyjątku na podstawie std :: wyjątek

10

literały łańcuchowe mają typ char const[], rozkładających się char const*. Należy dostosować obsługi catch odpowiednio:

catch (char const* msg) 
//   ^^^^^ 
{ 
    cout << msg; 
} 

Oto live example.

Wreszcie, tutaj jest lepszy sposób, aby przerobić swój program, za pomocą klas wyjątków od C++ Standard Library:

#include <iostream> 
#include <stdexcept> 
//  ^^^^^^^^^^^ For std::logic_error 

int divn(int n, int d) 
{ 
    if(d == 0) 
    { 
     throw std::logic_error("Division by ZERO not possible "); 
     // ^^^^^^^^^^^^^^^^ 
     // Throw by value 
    } 

    return n/d; 
} 

int main() // <== You should specify the return type of main()! 
{ 
    // Rather use these than "using namespace std;" 
    using std::cout; 
    using std::cin; 
    using std::endl; 

    int numer, denom; 
    cout << "Enter the numerator and denominator : "; 
    cin >> numer >> denom; 

    try 
    { 
     cout << numer << "/" << denom << " = " << divn(numer,denom) << endl; 
    } 
    catch(std::logic_error const& err) 
    // ^^^^^^^^^^^^^^^^^^^^^^^ 
    // Catch by reference 
    { 
     cout << err.what(); 
     //  ^^^^^^^^^^ 
    } 

    cout << "\nEnd of main() \n "; 
} 

i odpowiadająca live example oczywiście.

2

Wiadomość typu wyjątek mówi, że złapałeś niewłaściwy typ.

-1

Prostym rozwiązaniem jest dodanie oświadczenia ku górze, co następuje:

char * err = "Division by ZERO not possible"; 

Następnie zmienić throw do throw err;

Ma to związek z tym, jak kompilator przydziela pamięć dla napisowych.

+1

Konwersja na 'char *' jest nielegalna w C++ 11 –

+0

Należy również zmienić metodę main() na int main() i dołączyć wartość return (0); na końcu. – unxnut

+0

Zrobiłem zmienić moje 'main()', a 'return 0' nie jest konieczne dla' main() '. –