2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Ошибка при обработке исключений
Сообщение11.02.2023, 23:51 


24/01/22
61
При обработке исключений возникает ошибка "Project Project1.exe raised expception class $DifferentSizes with message 'Exception object Adress: ..."
c++ builder 10.4

main
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
nt _tmain(int argc, _TCHAR* argv[])
{
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);

        try
        {
                MyVector<int> a{6};
                MyVector<int> b{8};
                MyVector<int> c {9};
                c = a;
        }
        catch (DifferentSizes x)
        {
                printf("%s", x.print());
        }
        catch (OutOfSize x)
        {
                printf("%s", x.print());
        }
        catch (...)
        {
                std::cout << "We caught an exception of an undetermined type\n";
        }

        getch();
        return 0;
}
 


MyVector.cpp
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
        //---------------------------------------------------------------------------

#pragma hdrstop

#include "MyVector.h"
#include "list"

template<typename T>
MyVector<T>::MyVector(int size):
        m_size {size}
{
        m_vector = std::list<int>(m_size, T{});
}

template<typename T>
MyVector<T>::MyVector(const MyVector& v)
{
        if (m_size != v.m_size) throw DifferentSizes();
        m_vector = v.m_vector;
}

template<typename T>
T& MyVector<T>::operator[](int i)
{

        if (i > m_size) throw OutOfSize();
        int k = 1;
        for(auto iter = m_vector.begin(); iter != m_vector.end(); iter++)
        {
                if (k == i)
                return *iter;
                k++;
        }
}

template<typename T>
T MyVector<T>::operator[](int i) const
{
        if (i > m_size) throw OutOfSize();
        int k = 1;
        for(auto iter = m_vector.begin(); iter != m_vector.end(); iter++)
        {
           if (k == i)
                        return *iter;
           k++;
        }

}

template<typename T>
MyVector<T>& MyVector<T>::operator=(const MyVector<T>& v)
{
    if (m_size != v.m_size) throw DifferentSizes();
        m_vector = v.m_vector;
        return *this;
}

template<typename T>
int MyVector<T>::size() const
{
        return m_size;
}


const char* DifferentSizes::print() const
{
        return "Using vectors of different sizes in an operation.";
}

const char* OutOfSize::print() const
{
        return "Out of vector size.";
}

template class MyVector<int>;
#pragma package(smart_init)
 


MyVector.h
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
//---------------------------------------------------------------------------

#ifndef MyVectorH
#define MyVectorH

#include <list>
#include <iostream>


class IError
{
public:
        virtual const char* print() const = 0;
        virtual ~IError() = default;
};

class DifferentSizes: public IError
{
public:
        const char* print() const override;
};

class OutOfSize: public IError
{
public:
        const char* print() const override;
};

template<typename T>
class MyVector
{
private:
        std::list<T> m_vector;
        int m_size;
public:
        explicit MyVector(int size = 1);
        MyVector(const MyVector& v);

        ~MyVector() = default;

        T& operator[](int i);
        T operator[](int i) const;
        MyVector<T>& operator=(const MyVector<T>& v);
        int size() const;

        friend std::ostream& operator <<(std::ostream& out, const MyVector<T>& v)
        {
                out << '(';

                int k = 0;
                for (auto i: v.m_vector)
                {
                        out << i;
                        if (k < v.m_size-1 )
                                out << ", ";
                        k++;
                }

                out << ')';
                return out;
        }


        friend MyVector<T> operator*(const MyVector<T>& v, T k)
        {
                MyVector<T> temp { v };
                for (auto iter = temp.m_vector.begin(); iter != temp.m_vector.end(); iter++)
                        *iter *= k;
                return temp;
        }

        friend MyVector<T> operator*(T k, const MyVector<T>& v)
        {
        return v*k;
        }

        friend MyVector<T> operator+(const MyVector<T>& v, const MyVector<T>& w)
        {
                if (v.m_size != w.m_size) throw DifferentSizes();
                MyVector<T> temp {v.m_size};
                for (int i = 1; i <= temp.m_size; i++)
                {
                        T a = temp[i];
                        T b = v[i];
                        T c = w[i];
                        temp[i] = v[i] + w[i];

                }
                return temp;
    }
};


#endif
 

 Профиль  
                  
 
 Re: Ошибка при обработке исключений
Сообщение12.02.2023, 00:20 
Заслуженный участник


18/09/21
1756
Скомпилировал в gcc (mingw).
Нормально выводит в консоль "Using vectors of different sizes in an operation."
Может это вы под отладчиком запускаете и отладчик сам решил предупредить об exception...

(Оффтоп)

Это какие-то студенческие домашки?

 Профиль  
                  
 
 Re: Ошибка при обработке исключений
Сообщение12.02.2023, 02:50 
Аватара пользователя


28/10/21
100
XeuTeP_KoLLIu в сообщении #1581201 писал(а):
При обработке исключений возникает ошибка


Как уже заметил zykov, вы скорее всего просто настроили отладчик в своем IDE на то, чтобы он сразу перехватывал исключения и выполнял останов в момент их выбрасывания. Попросите отладчик продолжить выполнение - и управление перейдет в ваш обработчик исключения.

Если вам это мешает, то либо совсем отключите в настройках отладчика перехват исключений, либо запускайте свою программу на выполнение без отладчика.

 Профиль  
                  
 
 Re: Ошибка при обработке исключений
Сообщение21.09.2023, 06:45 
Аватара пользователя


20/12/22
14
Haldwani
Well, I searched about this error and I found that to fix this error you need to update catch block in main function.

Код:
try
{
    MyVector<int> a{ 6 };
    MyVector<int> b{ 8 };
    MyVector<int> c{ 9 };
    c = a;
}
catch (const DifferentSizes& x) // Catch by reference
{
    printf("%s", x.print());
}
catch (const OutOfSize& x) // Catch by reference
{
    printf("%s", x.print());
}
catch (...)
{
    std::cout << "We caught an exception of an undetermined type\n";
}


Thanks

 Профиль  
                  
 
 Re: Ошибка при обработке исключений
Сообщение21.09.2023, 13:13 


10/03/16
4444
Aeroport

(XeuTeP_KoLLIu)

XeuTeP_KoLLIu, разрешите обратиться по поводу Вашего ника: Вы ненавидите Коши или Колли, создателя дебюта Колли, или породу собак колли?

 Профиль  
                  
 
 Re: Ошибка при обработке исключений
Сообщение21.09.2023, 23:49 
Админ форума


02/02/19
2506
ozheredov
 !  Предупреждение за флуд в тематическом разделе.

 Профиль  
                  
 
 Re: Ошибка при обработке исключений
Сообщение07.10.2023, 01:13 
Аватара пользователя


28/10/21
100
gulshan212 в сообщении #1610781 писал(а):
Well, I searched about this error and I found that to fix this error you need to update catch block in main function.


Nope. Compared to the original version, your version of the code "fixes" absolutely nothing. There's no need and no reason to catch exceptions by reference in this code.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group