0

さて、私は大学で例外を学び始めたばかりです。これは、導入された値が私が確立した範囲外の場合に例外をスローすることになっているコードです...考えて分析すると、エラーが発生する可能性があると思いますスローで、そして他の質問で、実際にスローを宣言していないことを誰かが教えてくれます...私は愚かな間違いをしているかもしれませんので、申し訳ありませんが、私のコードは次のとおりです。

    #include <iostream>
#include <exception>


class ExcepcionRango : public std::exception{
protected:

    ExcepcionRango::ExcepcionRango(){
    }
public:
    virtual const char* lanzarExcepcion()=0;

};

class ExcedeRangoInferior : public ExcepcionRango{
public:
    ExcedeRangoInferior::ExcedeRangoInferior(){
    }
    const char* lanzarExcepcion() throw(){ //throw exception
        return "Value out of minimal range";
    }
};

class ExcedeRangoSuperior : public ExcepcionRango{
public:
    ExcedeRangoSuperior::ExcedeRangoSuperior(){
    }
    const char* lanzarExcepcion() throw(){ //throw exception
        return "value out of maximal range";
    }
};

int obtainValue(int minimo, int maximo){ //obtain value

    int valor; //value
    std::cout<<"Introduce a value between "<<minimo<<" and "<<maximo<<" : "<<std::endl;
    std::cin>>valor;
    return valor;

};

int main(){
    ExcedeRangoSuperior* exS = new ExcedeRangoSuperior();
    ExcedeRangoInferior* exI= new ExcedeRangoInferior();
    int min=3; 
    int max=10;
    int valor=0; //value
    try{
        valor=obtainValue(min,max);
        if(valor<min){

            throw exS->lanzarExcepcion();
        }
        if(valor>max){

            throw exI->lanzarExcepcion();
        }
    }catch(...){
        std::cout<<"Exception: ";
    }

    delete exS;
    delete exI;
    std::cin.get();
}

PD: 関数 lanzarExcepcion() は、挿入された値が範囲外の場合にメッセージをスローすることになっています

4

3 に答える 3

2

例外を間違った方法で使用しているため、コードを「リファクタリング」して、最も一般的な方法を示すことにしました。

#include <iostream>
#include <exception>

class ExcepcionRango : public std::exception
{
protected:
    ExcepcionRango::ExcepcionRango()
        { }
};

class ExcedeRangoInferior : public ExcepcionRango
{
public:
    ExcedeRangoInferior::ExcedeRangoInferior()
        { }

    const char *what() const
    {
        return "Valor fuera de rango inferior";
    }
};

class ExcedeRangoSuperior : public ExcepcionRango
{
public:
    ExcedeRangoSuperior::ExcedeRangoSuperior()
        { }

    const char *what()
    {
        return "valor fuera de rango superior";
    }
};

int obtainValue(const int minimo, const int maximo)
{
    int valor; 
    std::cout << "Introduzca un valor entre " << minimo << " y " << maximo << " : " << std::endl;
    std::cin >> valor;

    if (valor < min)
        throw ExcedeRangoInferior();
    else if (valor > max)
        throw ExcedeRangoSuperior();

    return valor;
};

int main()
{
    const int min = 3; 
    const int max = 10;

    int valor;

    try
    {
        valor = obtainValue(min, max);
    }
    catch (ExcepcionRango &exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }

    std::cin.get();
}
于 2012-06-15T06:09:38.580 に答える
0

あなたのコードは、あなたが思っていることをしません。

void fn() throw();

「関数 fn が例外をスローする」とは言いません。関数 fn は決して例外をスローしません (例外がスローされた場合、プログラムはすぐに呼び出さterminate()れて終了します。それを望んでいる可能性は低いです)。

代わりにthrow、関数内のステートメントの一部として値を指定してキーワードを使用します。

void fn()
{
    ExceptionRango e;
    throw e; // or just "throw ExceptionRango();"
}

int main()
{
    try
    {
        fn();
    }
    catch(ExceptionRangoInferior &e)
    {
        // Caught an exception of type ExceptionRangoInferior
    }
    catch(ExceptionRango &e) 
    {
        // Caught an exception of type ExceptionRango (or a subclass thereof
        // which isn't ExceptionRangoInferior because that was already caught
        // above
    }
    catch(...)
    {
        // Caught an exception of an unknown type
    }
}
于 2012-06-15T07:10:06.287 に答える
-2

さて、私はそれを修正しました、今は動作します!

    #include <iostream>
#include <exception>


class ExcepcionRango : public std::exception{
protected:

    ExcepcionRango::ExcepcionRango(){
    }
public:
    virtual const char* lanzarExcepcion()=0;

};

class ExcedeRangoInferior : public ExcepcionRango{
public:
    ExcedeRangoInferior::ExcedeRangoInferior(){
    }
    const char* lanzarExcepcion() throw(){ 
        return "Valor fuera de rango inferior";
    }
};

class ExcedeRangoSuperior : public ExcepcionRango{
public:
    ExcedeRangoSuperior::ExcedeRangoSuperior(){
    }
    const char* lanzarExcepcion() throw(){
        return "valor fuera de rango superior";
    }
};

int obtainValue(int minimo, int maximo){

    int valor; 
    std::cout<<"Introduzca un valor entre "<<minimo<<" y "<<maximo<<" : "<<std::endl;
    std::cin>>valor;
    return valor;

};

int main(){
    ExcedeRangoSuperior* exS = new ExcedeRangoSuperior();
    ExcedeRangoInferior* exI= new ExcedeRangoInferior();
    int min=3; 
    int max=10;
    int valor=0; 
    try{
        valor=obtainValue(min,max);
        throw valor;

    }catch(int){
        if(valor<min){

            std::cout<<"Exception: "<<exI->lanzarExcepcion();
        }
        if(valor>max){

            std::cout<<"Exception: "<<exS->lanzarExcepcion();
        }
        if(valor>min && valor<max){
            std::cout<<"Valor correcto"<<std::endl;
        }
        std::cin.get();
    }

    delete exS;
    delete exI;
    std::cin.get();
}
于 2012-06-15T02:21:30.173 に答える