41 Востаннє редагувалося -=ЮрА=- (17.02.2016 11:54:32)

Re: C++ — чи є життя без try finally?

Yola написав:

Не добрав :(

а що там добирати, базовий неабстактний клас з протектед деструктором створити можливо?
http://codepad.org/v7t9Anis
а то у нас з вами дискусія пішла у бік абстрактних класів. Ще раз кажу ці фінти помилка дизайну для того що наведено у темі...

Прихований текст

ось так можно
http://codepad.org/MShg6TbA

42 Востаннє редагувалося ADR (17.02.2016 22:36:11)

Re: C++ — чи є життя без try finally?

Прихований текст
-=ЮрА=- написав:

І куди ви мої івенти забрали?

- замінив їх на мьютекси (тіж івенти тільки з автосбросом), я взагалі вам синхронізацію демоснтрував, проте втикніть туди свою івенту(це на касається основної теми яку ви затронули, я навів вам приклад де ще окрім стейту батону обходимо дедлок при синхронізації при обвалі треди,а це куди критичніша помилка ніж активність елемнту гуі). Як какзав Геракліт "досить слів...", тому ось вам приклад з батонами

#include <iostream>
#include <thread>
#include <mutex>
#include <string>


std::mutex g_pages_mutex;

class cButtonEmul{
protected:
    bool bState;
public:
    cButtonEmul(bool bState = true){
        cButtonEmul::bState = bState;
    }
    bool getState(){return bState;}
    bool setState(bool bState){
        cButtonEmul::bState = bState;
    }
};

struct sThreadParam{
    std::string *url;
    cButtonEmul *btn;
};
 

void save_page(const sThreadParam &param)
{
    if( param.btn )
        param.btn->setState(false);
    g_pages_mutex.lock();
    try
    {
        try
        {
            if( param.url ){
            if( param.url->find("thrd2", 0) != std::string::npos )
                throw "I'm naipnulosya";
            else
            if( param.url->find("thrd1", 0) != std::string::npos )
                throw 0;
            else
               *param.url = "fake content";
            }
        }
        catch(const char * msg){
            if( param.url )
               *param.url = msg;
        }
    }
    catch(...){
        g_pages_mutex.unlock();
        if( param.url )
           *param.url = "unhandled exception occured!";
        if( param.btn )
            param.btn->setState(true);
        return;//àâàð³éíèé âèõ³ä
    }
    g_pages_mutex.unlock();
    if( param.btn )
        param.btn->setState(true);
}
 
int main()
{
    cButtonEmul btn1(false);std::string sDownload1 = "http://thrd1URL";
    cButtonEmul btn2(false);std::string sDownload2 = "http://thrd2URL";
    cButtonEmul btn3(false);std::string sDownload3 = "http://thrd3URL";
    sThreadParam prm1 = {&sDownload1, &btn1};
    sThreadParam prm2 = {&sDownload2, &btn2};
    sThreadParam prm3 = {&sDownload3, &btn3};
    std::thread t1(save_page, prm1);
    std::thread t2(save_page, prm2);
    std::thread t3(save_page, prm3);
    t1.join();
    t2.join();
    t3.join();
 
    g_pages_mutex.lock();  
    std::cout<< sDownload1 <<" btn1 state : "<<std::string(btn1.getState() ? "enabled" : "disabled")<<std::endl;
    std::cout<< sDownload2 <<" btn2 state : "<<std::string(btn2.getState() ? "enabled" : "disabled")<<std::endl;
    std::cout<< sDownload3 <<" btn3 state : "<<std::string(btn3.getState() ? "enabled" : "disabled")<<std::endl;
    g_pages_mutex.unlock();  
    return 0;
}

http://ideone.com/sA0aDG

unhandled exception occured! btn1 state : enabled - той трай якраз відпрацьовує щось зовсім несподіване. Як бачите ніякого файналі не потрібно.

по суті тут finally зроблений, як try catch із дубльованим кодом, який мав міститись у finally. мінуси цього варіанту у тому що він не підтримує return’и у try catch. але фіг з ними.

це, звичайно, варіант, але це вносить незручності... нє ну маємо що маємо, але все одно не розумію чому вони такі жадні на конструкцію try finall...




П. С. перерив інші форуми — переносимого рішення по емуляції try finally немає.

43 Востаннє редагувалося -=ЮрА=- (18.02.2016 07:23:40)

Re: C++ — чи є життя без try finally?

ADR написав:

мінуси цього варіанту у тому що він не підтримує return’и у try catch. але фіг з ними.

- це ви де побачили/прочитали/почули?

catch(...){
        g_pages_mutex.unlock();
        if( param.url )
           *param.url = "unhandled exception occured!";
        if( param.btn )
            param.btn->setState(true);
        return;//àâàð³éíèé âèõ³ä
    }

return можно робити де завгодно, важливо тільки щоб типи повертаємого значення співпадали.

#include <iostream>
#include <string>
using namespace std;

string func(int choise){
    try{
        if( choise == 1 )
            throw "some throw";
        else
        if( choise == 2 )
            return "try return";
    }
    catch(const char * msg){
        return msg;
    }
    return "normal return";
}

int main(){
    cout<<func(0)<<endl;
    cout<<func(1)<<endl;
    cout<<func(2)<<endl;
    return 0;
}

http://codepad.org/oGI6WM5i

normal return
some throw
try return

Прихований текст

Я вже який пост читаю та бачу що ви плохо знайомі з основними парадигмами С++, тому вам все й здається то невірним то недопрацьованним. Рекомендую трішки зануритись у вивчення такої прекрасної мови якою є плюси.

44

Re: C++ — чи є життя без try finally?

ADR написав:

нє ну маємо що маємо, але все одно не розумію чому вони такі жадні на конструкцію try finall...

- тому що плюси дають програмісту можливість опрацьовувати виключення, а не загоняють його у якісь жорсткі рамки.

45

Re: C++ — чи є життя без try finally?

Ви мене не правильно зрозуміли я про те що так можна:

try {
    for(...)
        for(...)
           if(...) return
} finally {
    <finally code>
}

а так ні (бо <finally code> не виконається):

try {
    for(...)
        for(...)
           if(...) return
} catch {
    <finally code>
    throw
}
<finally code>
-=ЮрА=- написав:

Я вже який пост читаю та бачу що ви плохо знайомі з основними парадигмами С++, тому вам все й здається то невірним то недопрацьованним. Рекомендую трішки зануритись у вивчення такої прекрасної мови якою є плюси.

можете порадити книжку по стилю програмування в плюсах?

-=ЮрА=- написав:

- тому що плюси дають програмісту можливість опрацьовувати виключення, а не загоняють його у якісь жорсткі рамки.

так інші мови ж дозволяють, а не заставляють використовувати цю конструкцію...

Подякували: Torbins, leofun012

46

Re: C++ — чи є життя без try finally?

ADR написав:

можете порадити книжку по стилю програмування в плюсах?

Подякували: leofun01, ADR2

47

Re: C++ — чи є життя без try finally?

Ну тоді вже
LLVM Coding Standards
Qt Coding Style

До речі гугл кодстайл мені щось бяка.

Подякували: ADR1