-
31. Data: 2012-06-06 02:28:49
Temat: Re: Try catch, prawidłowy sposób użycia
Od: n...@m...invalid
W dniu 5.06.2012 r. 17:15, AK pisze:
> Użytkownik <n...@m...invalid> napisał:
>
>> W dniu 5.06.2012 r. 10:16, AK pisze:
>>> Użytkownik <n...@m...invalid> napisał w wiadomości:
>>>
>>>>> To kwestia opcji/kompilatora ?
>>>> Tak. Ściśle rzecz biorąc, w C++ to UB.
>>>
>>> Nieprawda !
>> W rzeczy samej.
>
> Dopowiem: zaostrzenie (!) dyskusji :) z mej strony mialo na celu
> _wylacznie_ wbicie do glowy szczegolnie mlodym adeptom C++ w/w
> faktu.
Dziękuję w imieniu adeptów za naukę. :-)
Myślami byłem w okolicach securitologii (jest taka dyscyplina!) i Null
Pointer Dereference. Choć to wbrew runtime'owi i modelowi pamięci, to
wskaźnik 0 tak naprawdę może być wskaźnikiem na realne dane lub kod na
x86. Placement new można użyć na nullptr -- to niewątpliwie jest UB,
ale milcząco ignorowane.
<http://ideone.com/XIcw1>
> Po prostu zbyt czesto widze kod upstrzony tak:
>
> if ( ptr != NULL ) { delete ptr; }
>
> zamiast:
>
> delete ptr, ptr = NULL;
Zgoda. Doceniam dbałość o zwięzłość.
-
32. Data: 2012-06-16 23:08:27
Temat: Re: Try catch, prawidłowy sposób użycia
Od: Bronek Kozicki <b...@s...net>
On 04/06/2012 13:52, AK wrote:
> Użytkownik "Maciej Sobczak" <s...@g...com> napisał:
>
>> Ten kod może być zarówno dobry jak i niedobry, zależnie od kontekstu.
>
> Ten kod (A) jest zawsze zly.
tylko przy założeniu że "rollback" jest w sekcji catch. A mógłby być w
destruktorze, np:
class Connection
{
friend class Transaction;
void begin();
void rollback();
void commit();
void execute(const Statement&);
// . . .
};
class Transaction
{
Connection& conn_;
bool active_;
public
Transaction(Connection& c) conn_(c), active_(false)
{}
~Transaction()
{
if (active_)
conn_.rollback();
}
void commit()
{
if (active_)
{
conn_.commit();
active_ = false;
}
}
void execute(const Statement& s)
{
if (!active_)
{
conn_.begin();
active_ = true;
}
conn_.execute(s);
}
};
try
{
Transaction t(c);
t.execute(s1);
t.execute(s2);
t.commit();
t.execute(s3);
t.commit();
}
catch (Error e)
{}