Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
try
a := A.Create;
try
a.Foo;
except
//do Something
end
finally
a.free;
end;
self.p := P.Create;
p.Foo; // exception;
p.free;
try
a := A.Create;
аa := A.Create;
try
a := nil;
b := nil;
c := nil;
try
a := A.Create;
b := B.Create;
c := C.Create;
// Some code with a, b and c objects
finally
c.Free;
b.Free;
a.Free;
end;
try
a.Foo;
except
//do Something
end
p.Foo; // exception;
p.free;
function TMenuStack.Pop: TCustomActionMenuBar;
begin
Result := PopItem;
if csDesigning in FMenu.ComponentState then
FreeAndNil(Result)
else
if Assigned(Result.ActionClient) then
begin
Result.ActionClient.ChildActionBar := nil;
Result.FChildMenu := nil;
Result.ActionClient := nil;
if (Count = 1) and not (FMenu is TCustomActionPopupMenu) then
Peek.FCachedMenu := Result as TCustomActionPopupMenu
else
FreeAndNil(Result);
end;
end;
destructor TInternalMDIAction.Destroy;
begin
if Assigned(FClientItem) then
FClientItem.Free;
inherited;
end;
self.p := P.Create;Given that Google's existing code is not exception-tolerant, the costs of using exceptions are somewhat greater than the costs in a new project.
Рассмотрим пример на основе функции получения точки. Предположим, она считывает очередную точку из некоторой очереди. Вот как выглядит код без использования исключений:
while (!queue.isEmpty()) {
Point point = queue.getPoint();
if (point != null) {
...
}
}
В этом примере проверка на null будет выполнятся всегда, при каждой итерации.
Point getPoint()
{
Point result(std::numeric_limits::quiet_NaN(),std::numeric_limits::quiet_NaN());
/// Действия по поиску точки.
return result;
}try {
while (!queue.isEmpty()) {
Point point = queue.readPoint();
...
}
} catch(PointNotFoudException ex) {
throw new QueueReadingException(ex);
}catch.Код станет более элегантным, и на производительности это сильно не скажется.
С каких это щей я буду неправильно обрабатывать коды ошибок? Или вы считаете, что я стремлюсь наделать ошибки и в своем коде? Наоборот.
try
{
Application->Initialize();
...
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
// WTF ??? 0_o
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
TBool TTextResoundingAnalyser::LoadText(const TTextString & tFileName)
{
try
{
TVCLFileDataLoader _VCLFDL;
TRawDataItem rdi(&_VCLFDL, tFileName);
TUInt index = _RawDataContainer.AddItem(rdi);
_RawDataContainer.UnvirtualizeAll();
_Alias = _RawDataContainer[index].Alias();
_CreateMapCovers();
_CalculateMaps();
}
catch(...) { return false; }
return true;
};
1.б Также, пока не нашел, как выполнить запрос типа «CREATE DATABASE ». Чтобы выполнить запрос нужно подключиться к БД, а её еще нет.
2. Графика виджетов основана на вычислениях с плавающей точкой. Из-за чего на платформах без математического сопроцессора (ARM, например) интерфейс здорово подтормаживает.
3. В наследуемых от QObject классах нельзя использовать множественное наследование.
И ЕМНИП нельзя никак использовать множественное наследование если указали в классе макрос Q_OBJECT.
class MainWindow : public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
};
while (!queue.isEmpty()) {
Point point = queue.readPoint();
if (point != null) {
...
}
}Result := TX.Create;
try
Result.Y := Z;
except
FreeAndNil(Result);
raise;
end;
function TryGetConfig(out AConfig: IXML): Boolean;
begin
Result :=
TryReadXmlFromFile( userProfile.go( 'config.xml' ), AConfig) or
TryReadXmlFromFile( defaultProfile.go( 'config.xml' ), AConfig) or
TryDomParse( '<config/>', AConfig);
end;
function GetConfig: IXML;
begin
try
Result := ReadXmlFromFile(userProfile.go( 'config.xml' );
except
on E: XMLError do
try
Result := ReadXmlFromFile(defaultProfile.go('config.xml'));
except
on E: XMLError do
begin
Result := DomParse('<config/>', AConfig);
end;
end;
end;
end;
def point: Option[Point]
val withDefault = point.getOrElse(new Point(NaN,NaN))
val throwIfNone = point.get
val orNull = point.getOrNull
val complexResult = for {
p1 <- point
p2 <- point
}
yield distance(p1,p2) // Some(distance) only if p1 and p2 are Some
Оптимизация ошибок?!