LINUX.ORG.RU

а что, полезность ислючений заключается в указании номера строки?

Pi ★★★★★
()
Ответ на: комментарий от Teak

>Это где такое написано? :)

А где написано обратное?

seiken ★★★★★
() автор топика
Ответ на: комментарий от Pi

>а что, полезность ислючений заключается в указании номера строки?

А в чём заключается полезность исключений?

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

> А в чём заключается полезность исключений?

В том, что обработка ошибок сосредоточена в специальных секциях, а не размазана по коду. В том, что неперехваченное исключение валит программу, а не проходит незамеченным.

Насчет строки и файла возникновения исключения - многие (все?) компиляторы предоставляют (нестандартизованные) средства узнать это.

А матчасть надо учить :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

> В том, что неперехваченное исключение валит программу, а не проходит незамеченным.

Сомнительный аргумент, такие исключения ловить надо в main, что бы перед заказчиком потом стыдно не было :)

aton
()

Жжош кросавчег. Ностальгия по Java/C#? ;)

С помощью костылей это реализуемо. Смотри исходники Unreal, например.

execve
()

>если они не могут указать номер строки, где было сгенерировано >исключение?

Почему не могут?
$cat example.cpp

#include <stdexcept>
#include <iostream>
#include <sstream>
#include <string>

class file_line_info : public std::runtime_error {
public:
	file_line_info(const char *fname, int line, const std::string& info): std::runtime_error("") {
		std::ostringstream os;
		os << "File " << fname << ", line " << line << ": " << info;
		data_ = os.str();
	}
	~file_line_info() throw() {}

	virtual const char* what() const throw() { return data_.c_str(); }
private:
	std::string data_;
};

#define POSITION_EXCEPT(info) file_line_info(__FILE__, __LINE__, (info))

class Foo {
public:
	Foo(int i) throw(std::exception) {
		if (i < 0)
			throw POSITION_EXCEPT("invalid value");
		val_ = i;
	}
	int value() const { return val_; }
private:
	int val_;
};

int main() try {
	Foo f(-1);
	std::cout << f.value() << std::endl;
} catch (const std::exception& e) {
	std::cerr << "Catch error: " << e.what() << std::endl;
}

$g++ -Wall -O0 example.cpp -o line_info_example
$./line_info_example
Catch error: File example.cpp, line 26: invalid value

fghj ★★★★★
()

--- foo.cc ---

#include <iostream>

class Exception {
public :
    Exception(
        const char *msg,
        const char *file,
        const char *fnc,
        int line) :
        msg_(msg), file_(file), fnc_(fnc), line_(line) { }

    std::ostream &put(std::ostream &os) const {
        os << file_ << "." << fnc_ << "."
           << std::dec << line_ << ": " << msg_;
        return os;
    }

private :
    const char *msg_, *file_, *fnc_;
    int line_;
};

std::ostream &
operator << (std::ostream &os, const Exception &e)
{
    e.put(os);
    return os;
}

int
main(void)
{
    try {
        throw Exception("First failure", __FILE__, __FUNCTION__, __LINE__);
    } catch (const Exception &e) {
        std::cout << e << std::endl;
    }

    try {
        throw Exception("Second failure", __FILE__, __FUNCTION__, __LINE__);
    } catch (const Exception &e) {
        std::cout << e << std::endl;
    }

    return 0;
--- foo.cc ---

foo@localhost: ./foo
foo.cc.main.35: First failure
foo.cc.main.41: Second failure

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от fghj

Так и знал, что есть возможность создания костыля при помощи макросов. Теперь понимаю суть С++ - это набор "сделай сам" с большим количеством подпорок и костылей, созданный в условиях максимальной совместимости с С.

seiken ★★★★★
() автор топика
Ответ на: комментарий от aton

>> В том, что неперехваченное исключение валит программу, а не проходит незамеченным.

>Сомнительный аргумент, такие исключения ловить надо в main, что бы перед заказчиком потом стыдно не было :)

Отличный аргумент - на этапе отладки ошибки не уходят незамеченными. А перед сдачей можно поставить catch (...) в main, и выводить то, что обсуждается в соседней ветке :)

tailgunner ★★★★★
()
Ответ на: комментарий от seiken

а ты всё-таки почитай что-нибудь, а потом суди.

Pi ★★★★★
()
Ответ на: комментарий от seiken

> Теперь понимаю суть С++ - это набор "сделай сам" с большим количеством подпорок и костылей

Ааа... так ты пофлеймить пришел? :/

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>Ааа... так ты пофлеймить пришел? :/

Нет, мне действительно нужно отслеживать ошибки, попробую пример с макросами. Всем спасибо за ответы.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

seiken, ты прав. C++ извращённый язык. В нём всё приходится делать руками. Более того, это "всё" можно сделать таким извращённым способом, что некоторые даже со второго раза не просекут. Это язык для полных психов!

P.S. Вот за это я его и люблю! Он как раз для меня! :-)

yz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.