LINUX.ORG.RU

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

 


2

4

Волею случая сейчас делаю один проект на Qt, после Java хочется жирненько обмазать метод исключениями, а тут опаньки и такое вот написано, почему так?

http://qt-project.org/wiki/Coding-Conventions

Перемещено mono из talks

Ответ на: комментарий от anonymous

Смотри стадии

auto p = some_allocate(sizeof(my_type)); // выделяем память
auto obj = new (p) my_type(/*...*/); // конструируем объект
//...
obj->~my_type(); // уничтожаем объект
some_free(p); // освобождаем память

anonymous
()
Ответ на: комментарий от ranka-lee

Так чего ждать-то? Получил данные - закрыл файл. Через RAII, прикинь. Асинхронности это как мешает? Можешь ты код показать?

anonymous
()
Ответ на: комментарий от ranka-lee

Никогда.

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

void showImage(const char* filename) {
    Image image(filename); // ждем, пока загрузится/распакуется
    drawImage(image);      // рисуем
    waitKeyboardEvent();   // ждем реакции пользователя
    Quit();                // выходим
}
Как улучшить этот код при помощи асинхронности?

ddos3
()
Ответ на: комментарий от anonymous

l.push_back([] () {твой неосиляторский откат 1;}

Ну ты и тупой. Кто этот откат будет делать в случае эксепшена?

обезьянка

Не попал. А вот тебя эволюция стороной обошла, да.

причем не рабочий.

У тебя мозги менее функциональны, чем этот некомпилирующийся снипет. Вали от сюда, рак.

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

твой эксепшн разве не стопает конструктор?

Чё ты мелешь, дегенерат? Нахрен мне объект если у него конструктор не отработал? Я тебе(я) ещё раз не поленюсь послать подальше отсюда. Иди дальше объясняй детишкам в яслях про сырые указатели, чучело.

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

Ты ошибаешься. Тебе 100500 раз об этом сказали уже разные люди, но ты твердишь.

В чем я ошибаюсь? Чтож вы такие глупые. Там есть рефкаунт.

Поинтер должен определять при деструкторе является ли он единственным владельцем, после чего юзается деструктор. Тут не глобальный рефкаунт, а локальный, который мигрирует и свичится состояние на миграции, ибо владелец должен быть один. Поэтому объект копирования зануляется, но ты не может отменить деструктор, поэтому один хрен нужно состояние «можно/нельзя удалять - являюсь ли я владельцем».

У любого вашего поинтера есть рефкаунт, если в ваших нулёвых толмудах написано что его нет, то это не мои проблемы - он есть.

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

Поинтер должен определять при деструкторе является ли он единственным владельцем

unique_ptr всегда единственный владелец. Поэтому рефкаунт ему не нужен.

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

один хрен нужно состояние «можно/нельзя удалять - являюсь ли я владельцем».

Мы не можем не быть владельцем. Есть объект - удаляем.

anonymous
()
Ответ на: комментарий от ranka-lee

Конечно, только я не вижу связи с RAII.

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

Ужасный, бесчеловечный код. Картинку можно и нужно прогрессивно рисовать. Надо выводить прогресс загрузки / эмитировать активность. Надо давать возможность отменить загрузку.

Пользователь смотрел картинки, наткнулся на гигабайтный tiff и программа «повисла» - «в линуксе нет ни одной програмы для просмотра картинок, не готов к десктопу»

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

unique_ptr всегда единственный владелец. Поэтому рефкаунт ему не нужен.

Нужен. Он может не быть владельцем. Он должен знать - является ли он владельцем.

Это такой же рефкаунт. Рефкаунт это такая байда, которая говорит - есть ли ссылки на объект внутри и сколько. Тут разница лишь в том, что ссылка может быть только одна - он её передаёт. Но один хрен - он знает есть ли эта ссылка или нет.

anonymous
()
Ответ на: комментарий от quest

Дядя Боб с тобой не согласен.

В далеком прошлом многие языки программирования не поддерживали 
механизма обработки исключений. В таких языках возможности обработки и получения информации об ошибках были ограничены. Программа либо устанавливала флаг ошибки, либо возвращала код, который проверялся вызывающей стороной. Оба способа продемонстрированы в листинге 7.1.

public class DeviceController {
public void sendShutDown() {
DeviceHandle handle = getHandle(DEVl);
// Проверить состояние устройства
if (handle != DeviceHandle.INVALID) {
// Сохранить состояние устройства в поле записи
retrieveDeviceRecord(handle);
// Если устройство не приостановлено, отключить его
if (record.getStatusO != DEVICE_SUSPENDED) {
pauseDevice(handle);
clearDeviceWorkQueue(handle);
closeDevice(handle);
} else {
logger.log("Device suspended. Unable to shut down");
}
} else {
logger.log("Invalid handle for: " + DEVl.toString());
}
}
} 

У обоих решений имеется общий недостаток: они загромождают код на стороне вызова. Вызывающая сторона должна проверять ошибки немедленно после вызова. 
К сожалению, об этом легко забыть. 
По этой причине при обнаружении ошибки лучше инициировать исключение. 
Код вызова становится более  понятным, а его логика не скрывается за кодом обработки ошибок.
В листинге 7.2 представлен тот же код 
с выдачей исключений в методах, 
способных обнаруживать ошибки.
Обратите внимание, насколько чище стал код. 
Причем дело даже не в эстетике. 
Качество кода возросло, потому что два аспекта, 
которые прежде были тесно переплетены — алгоритм отключения устройства и обработка ошибок, — теперь изолированы друг от друга. Вы можете рассмотреть их по отдельности и разобраться в каждом из них независимо.

Листинг 7.2. DeviceController.java (с исключениями)
public class DeviceControl1er {
public void sendShutDown() {
try {
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
private void tryToShutDown() throws DeviceShutDownError {
DeviceHandle handle = getHandle(DEVl);
DeviceRecord record = retrieveDeviceRecord(handle);
pauseDevice(handle);
clearDeviceworkQueue(handle);
closeDevice(handle);
}
private DeviceHandle getHandle(DeviceID id) {
throw new DeviceShutDownErrorCInvalid handle for: " + id.toString();
}
 
}
LongLiveUbuntu ★★★★★
()
Последнее исправление: LongLiveUbuntu (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

оО, неужели нулёвая балаболка решила меня на понт взять.

Я пишу для железа

Пишешь, для железа - мериет - тактируемое. Тгерц. Куллстори.

которое меряет пикосекунды

Предположим ты проболаболил, возмём счётчик на рассыпухе - Терагерц - куллстори.

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

Мне покласть где ты полы за еду моешь.

Так что я тебе сейчас расскажу что такое наносекудна, пустозвон.

Валяй.

Расскажи мне про наносекунду, сколько же там за наносекунду раз у нас ищется catch в паре сотней вложений, а потом сколько же раз за наносекунду у нас вызывается free() - расскажи, мне очень интересно.

Вали кушать борщ со своим нулёвым коНпеляротом и компанией, метросексуал.

Как круто, проболаболил, а ответить-то нечего, да? Пошли понты, молодец.

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

Ты с ума сошёл? Нет тут никакого подсчета ссылок. Потому что нечего считать - ссылка всегда одна. Ошибся - признай, не отмазывайся

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

Расскажи мне про наносекунду, сколько же там за наносекунду раз у нас ищется catch в паре сотней вложений, а потом сколько же раз за наносекунду у нас вызывается free() - расскажи, мне очень интересно.

Ты узколобый инвалит умственного труда. Ты реально думаешь, что пикосекунды считает компьютер? Ты походу, кроме слов free() и хип больше не знаешь нихрена. А ну да, ещё коНпелятор и ноль. Именно по этому у тебя проблемы, малыш. Сиди дальше в своём болоте 80х и жри экскременты.

а ответить-то нечего, да

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

возмём счётчик на рассыпухе

Хахаха, на рассыпухе! Да ты просто минус девять тысяч!) Микросхемы то в живую видел вообще? Или только на лоре про них читал?

Не можешь отличить конструктор от деструктора, а учишь других алоцировать гигабайты на стеке, потому что стек быстрее. Это ж надо быть таким тупым. Да весь лор просто ухахатывается с твоих высеров, а когда кто пишет слово царь все уже знаю: „о, сейчас балабол начнёт балаболит и срать на всё словами нулёвый, коНпелятор и прочей ахинеей, при этом не понимая, что сам минус один в этом деле. Смотри лор, сейчас будет очередной слив царя!“.

Я тебе ещё раз пишу, вали отсюда, убогий.

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

Ты с ума сошёл?

Какразтаки не я.

Потому что нечего считать - ссылка всегда одна

Уже оказывается ссылка-то есть, ты курлыкал выше, что её нет, не? Она не всегда одна, ты понимаешь что состояние бывает пустое.

Ещё раз для даунов - в auto_ptr - 2 стсотяния >1 и ==1, состояние ==0 не используется, ибо оно происходит уже в деструкторе мейна.

В unique_ptr - 2 состояния 1 и ==0. - и ещё раз для дауна, кроме поинтера в unique_ptr есть состояние, - которое отвечает за количество ссылок. Даже если она одна.

Ошибся - признай, не отмазывайся

В чем же я ошибся, ты мне расскажешь?

Что ты настолько туп, что не понимаешь - задача рефкаунта не считать ссылки, а давать ответ - ==1, в данном случае логика повторяется.

Вперёд пилить unique_ptr без рефкаунта и его эмуляции. У тебя есть только: const type * ptr; const int t = 1; Ты же мне покажешь, а?

anonymous
()
Ответ на: комментарий от nanoolinux

Как же ты поплыла, обезьяна.

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

Я пишу для железа

Пишу - программа + железо = копьютер - без разницы какая логика.

Ты реально думаешь, что пикосекунды считает компьютер?

Кулстори. Ты такой тупой, я просто поржаюсь - как можно так плыть.

Я тебя уличаю в том, что копьютер считать пикосекунды не умеет, а ты мне, даун, доказываешь «Ты реально думаешь, что пикосекунды считает компьютер?». Ты не понимаешь в чем проблема?

А для чего ты «пишу для железа»? Ты же мне расскажешь?

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

Ничего я выше не увидел, ты же мне покажешь «пишу для железа»?

Хахаха, на рассыпухе! Да ты просто минус девять тысяч!) Микросхемы то в живую видел вообще? Или только на лоре про них читал?

А тыж мне покажешь счётчик с частотой терагерц, а? Обезьяна.

Не можешь отличить конструктор от деструктора, а учишь других алоцировать гигабайты на стеке, потому что стек быстрее.

Ты же мне расскажешь где я не отличил конструктор от деструктора и где я кого-то учил «алоцировать гигабайты на стеке»?

Да весь лор просто ухахатывается с твоих высеров

Уже съехал на всех. Аргументация так и прёт.

при этом не понимая, что сам минус один в этом деле

Конкретно в чем?

Смотри лор, сейчас будет очередной слив царя!

Это в твоих мечтах?

anonymous
()
Ответ на: комментарий от nanoolinux

Ну ты и тупой. Кто этот откат будет делать в случае эксепшена?

Какой жопой

Это:

for_each(l, [] (Recoil &r) {r.discharge();})

Это:

void discharge() {discharged = true;}

помогает делать откат в случае эксепшна? Ты же мне расскажешь. У тебя, даунёнок вызвается откат совершенно в другом деструкторе и эксепшн ему никак не мешает.

У тебя мозги менее функциональны, чем этот некомпилирующийся снипет. Вали от сюда, рак.

Ты же мне запустишь свой кусок говна, чтобы он работал? Курлыканье не делает из твоего говна что-то рабочее.

anonymous
()
Ответ на: комментарий от nanoolinux

Как ты метко о себе, а! Да у тебя талант!

Ещё раз - я жду рабочую портянку, ты же мне её дашь - это же так просто? Ты же её уже сделал? Ну дак давай.

Я же о себе, а не о тебе - пока, что оно так и есть.

anonymous
()
Ответ на: комментарий от nanoolinux

Терагерцем даже близко не пахнет. Это 100 гигагерц. Это не пикосекунды даже близко. Причем что такое «разрешение» там не написано. Скорее всего это даже не 100гигагерц.

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

Обезьяна тупая, там как рефкаунт используется nullptr. (ptr != null) == refcount==1(можно удалять себя), (ptr == null) == refcount == 0(нельзя - ты не владелец).

Это сонова логики. Обезьяна мне рассказывает про сорцы.

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

жду рабочую портянку,

Портянка всегда рабочая, даже с дырками которая. Я тебе уже всё написал давно. Если ты не можешь осилить - ну ты неосилятор тогда, чо.

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

Это не пикосекунды даже близко

Копай глубже. Но я боюсь ты даже если даташит пять раз прочитаешь, всё равно не сможешь понять откуда там пикосекунда берётся. У тебя всё на рассыпухе, ёпта. Нахер тебе нужны технологии 21 века, лучше всё сделать на к155ла3, а остальное сделать на С, но память выделять прямо в мозгу, нахер стек.

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

Ого, внезапно указатель стал рефкаунтером? Кукарекай ещё.

(ptr != null) == refcount==1(можно удалять себя)

(ptr != null) == объект есть, его нужно удалять.

(ptr == null) == refcount == 0(нельзя - ты не владелец).

(ptr == null) == объекта нет, а раз его нет, то и удалять нечего.

Как видно, про какое-то владение тут нет ничего.

У тебя эпичный слив, нуб.

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

Ага, а атеизм - это вера в богов(просто количество богов = 0)... Тебе, дураку, уже 100500 раз объясняли, что никакие ссылки в unique_ptr не считаются. Он просто единовластно владеет ресурсом. Нет там никакого рефкаунтинга там.

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

Где тут подсчет ссылок? Это просто проверка указателя на null

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

Ага, а атеизм - это вера в богов(просто количество богов = 0).

Почти, кол-во богов равно i.

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

Портянка всегда рабочая, даже с дырками которая. Я тебе уже всё написал давно. Если ты не можешь осилить - ну ты неосилятор тогда, чо.

Чё обезьянка, не смогла заставить работать своё гвоно и кукарекает? Я уж не говорю о говноконтейнерах, которые тоже с побочным эффектом и тоже может упасть(тогда деструктор не вызовется, обезьяна) и твои recoil"ы тоже.

Мне вот не ясно, если оно работает - где рабочее? Зассал?

anonymous
()
Ответ на: комментарий от nanoolinux

И в очередной раз ответить тебе нечего. Ну пытайся копипастить для даунов, авось кто-то поверит в том, что ты не обосрался.

anonymous
()
Ответ на: комментарий от nanoolinux

Копай глубже.

Покажешь же мне, да? Я жду пруфец терагерцового счётчика.

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

Там не пикосекунды, обезьяна, там максимальный резолюшн 1/100нс.

Ну дак расскажи пацанам, откуда там пикасекунда берётся. Что считает твоя байда.

Или поломойке это ещё не рассказали?

У тебя всё на рассыпухе, ёпта. Нахер тебе нужны технологии 21 века, лучше всё сделать на к155ла3, а остальное сделать на С, но память выделять прямо в мозгу, нахер стек.

Какая там технология. Обезьянья мкашка с обвязкой. В чем там заключется технологий с твоей стороны? Ты типа пытаешься казаться не рядовой обезьяной с авркой, а илитной?

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

Ого, внезапно указатель стал рефкаунтером? Кукарекай ещё.

Причем тут указаль, я в указатель могу рефкаунт и для auto_ptr засунуть.

(ptr != null) == объект есть, его нужно удалять.

Нет обезьянка, оно изменяет состояние во время копирования - это передача ссылки - это такой же рефкаунт.

Как видно, про какое-то владение тут нет ничего.

Тыж только что кукарекал «Объект есть», а если он есть - им владает поинтер, так? А раз он им владает - он может его удалить. Т.е. помножил на ноль свой выхлоп?

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

Он просто единовластно владеет ресурсом. Нет там никакого рефкаунтинга там.

Датычё, а когда ты передаёшь «ресурс», то состояние владения меняется. Что это?

Ещё раз, тупой даун. Атеизм это итак вера в богов и их далеко не ноль.

Для дауна - есть вера в богов и без разницы сколько богов - надо знать - «нет богов» и «боги есть». Флаг есть, и даже если он не называется «рефкаунт» он не перестаёт им быть..

Можно расширить юзкейс до «сколько богов».

Даже auto_ptr не считает ссылки - это просто множественное состояние. Это нужно, чтобы следующая передача не сбросила флаг. В unique_ptr флаг сбрасывать можно в auto_ptr нет. Именно по этой причине там и счётчик. Сам как таковой «счётчик» там нахрен не нужен.

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

К сожалению, об этом легко забыть.

офигенный аргумент

Код вызова становится более понятным

Походу он все перепутал

quest ★★★★
()

«C++ — это ужасный язык. Даже если бы С не давал никаких преимуществ, кроме отпугивания программистов на C++, это было бы уже достаточным аргументом в пользу C»

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