// ************************************************ // Tratamento de Exceções // // ************************************************ #include using std::cout; using std::cin; using std::endl; using std::string; using std::set_terminate; using std::set_unexpected; class TrataDivZero { public: TrataDivZero(string s); TrataDivZero(string s, int n); void Msg(); private: string s; int n; }; TrataDivZero::TrataDivZero(string s) { cout << s << endl; this->s = s; this->n = 0; } TrataDivZero::TrataDivZero(string s, int n) { cout << s << n << endl; this->s = s; this->n = n; } void TrataDivZero::Msg() { cout << "Tratador de erro foi chamado ..." << endl; cout << "Dados da Exceção: " << s << endl << n << endl; } void Encerra() { cout << "Função Alternativa para encerramento..." << endl; system ("pause"); } void ExcecaoInesperada() { cout << "Execeção Inesperada..." << endl; system ("pause"); } int main() throw (TrataDivZero) { int n, m; cout << "Numerador: "; cin >> n; cout << "Denominador: "; cin >> m; set_terminate(Encerra); set_unexpected(ExcecaoInesperada); try { //throw (string ("AB")); // Provoca o encerramento do programa // pois não há tratador de exceção para este objeto // para evitar isto, usa-se o catch(...) // ou "set_unexpected" if (m==0) throw (TrataDivZero("Divisao por zero")); if (m<0) throw (TrataDivZero("Divisao por nro negativo: ", m)); cout << "Divisão: " << n/m << endl; } catch (TrataDivZero T) // pode ter ou não o objeto { // apenas o tipo é obrigatório T.Msg(); } // aqui o objeto T não existe mais !! // catch (...) // isto evita a chamada da "ExcecaoInesperada" // { // cout << "Capturando as demais exceções..." << endl; // // throw; // } cout << "Fim..." << endl; system("pause"); return 0; } /* Numerador: 2 Denominador: 4 Execetpo Inesperada... Press any key to continue . . . Funtpo Alternativa para encerramento... Press any key to continue . . . */