Вот пример на C#.
Программист написал бы так:
using (var sr = new StreamReader("file.txt"))
{
var s = sr.ReadLine();
}
А компилятор скомпилировал бы так:
StreamReader sr = null;
string s = null;
try
{
sr = new StreamReader("file.txt");
} catch { }
try
{
s = sr.ReadLine();
} catch { }
try
{
sr.Close();
} catch { }
catch'и в моем примере везде пустые, поэтому никаких диалоговых окон с информацией об ошибке не выводится, но можно сделать и так, чтобы что-то выводилось, и это просто (с помощью класса Exception).
И главное - вылет программы и даже подпрограммы из-за какой-то отдельной строчки с ошибкой - стал бы исключен в любом случае.
Не вылетали бы приложения Android... Не вылетали бы драйвера в синий экран из-за какого-то жалкого деления на 0... BSODов бы вообще не было...
Можно было бы сказать, что весь код теперь стал в какой-то мере управляемым, во всяком случае, обрел одно из ключевых преимуществ управляемого кода.
А вот какие могли бы быть побочные, негативные эффекты, и за счет чего?
Другие языки программирования и технологии
Как думаете, стало бы ПО стабильнее, если бы все компиляторы сами ВЕСЬ код "заворачивали" в try-catch'и?
С ума посходили?
Ошибки обрабатывать нужно. Идея в том, что если в языке есть деструкторы, то кол-во try... catch блоков в хорошем коде минимально, а throw можно использовать часто.
Если деструкторов нет, то вместо них finally. Вопрос вкуса, я не люблю эти finally, деструкторы они намного надежнее и немногословнее в большой проге, только требуют наличие программиста, а не кодера.
Ошибки обрабатывать нужно. Идея в том, что если в языке есть деструкторы, то кол-во try... catch блоков в хорошем коде минимально, а throw можно использовать часто.
Если деструкторов нет, то вместо них finally. Вопрос вкуса, я не люблю эти finally, деструкторы они намного надежнее и немногословнее в большой проге, только требуют наличие программиста, а не кодера.
Михаил Яковлев
"Ошибки обрабатывать нужно, но трукатчей не нужно. " У вас раздвоение личности? Или вы просто не знаете, что обработка ошибки = трукатч?
Во-первых это медленно, а во-вторых ислкючение может быть нормальным поведением программы. Например, пользователь неправильно ввел данные, ты вызвал исключение, а компилятор его съел и поехал дальше. Не, прикольно конечно... Например, прикольно было бы в банковском переводе указать отрицательную сумму, да?
Михаил Яковлев
> медленно
Замеряли? Сравнивали? Результаты в студию.
> в банковском переводе указать отрицательную сумму
А зачем в валидации ввода нужны экскепшны? Тупо if-else и все.
Замеряли? Сравнивали? Результаты в студию.
> в банковском переводе указать отрицательную сумму
А зачем в валидации ввода нужны экскепшны? Тупо if-else и все.
Тут важнее другое.
Прикинь: файла по данному пути нет. Переместили или переименовали.
А у нас
s = sr.ReadLine();
- но читать неоткуда, поэтому s остается пустой
а ведь мы ее читали не просто так, а хотим что-то делать с его содержимым. Например, это наше коммерческое предложение, которое мы хотим рассылать.
И вот программа работает, но подписчики наши вместо нашего предложения получили пустое письмо и ничего не заказали.
И зачем такая программа?
Блок catch должен давать пользователю возможность исправить положение! Например, при отсутствии файла сообщать об этом, сообщать, какой файл нужен и куда его положить и давать возможность открыть его повторно, когда юзер его положит или переименует обратно. При отсутствии значения в строке, с которой надо что-то делать, должен запросить у юзера ту строку.
А компилятор, делающий это автоматически, написать сложнее.
Прикинь: файла по данному пути нет. Переместили или переименовали.
А у нас
s = sr.ReadLine();
- но читать неоткуда, поэтому s остается пустой
а ведь мы ее читали не просто так, а хотим что-то делать с его содержимым. Например, это наше коммерческое предложение, которое мы хотим рассылать.
И вот программа работает, но подписчики наши вместо нашего предложения получили пустое письмо и ничего не заказали.
И зачем такая программа?
Блок catch должен давать пользователю возможность исправить положение! Например, при отсутствии файла сообщать об этом, сообщать, какой файл нужен и куда его положить и давать возможность открыть его повторно, когда юзер его положит или переименует обратно. При отсутствии значения в строке, с которой надо что-то делать, должен запросить у юзера ту строку.
А компилятор, делающий это автоматически, написать сложнее.
Не дай бог такое. Десктопами софт не ограничивается ведь, правда?
Михаил Яковлев
Причем здесь десктоп?
оно было бы стабильно нерабочее ибо хер знает, где ошибка?
Михаил Яковлев
Вы на код-то в вопросе смотрите.
Чуть ли не для каждой строки - свой try-catch. Поэтому в catch вполне можно выводить окошко не только с полной инфой об ошибке, но и с указанием номера строки, где возникла ошибка. Без всяких отладчиков.
Чуть ли не для каждой строки - свой try-catch. Поэтому в catch вполне можно выводить окошко не только с полной инфой об ошибке, но и с указанием номера строки, где возникла ошибка. Без всяких отладчиков.
Исключения лучше обрабатывать на самом верхнем уровне, иначе потом запаришься их по всему коду выискивать. Такой подход вообще большое зло.
Михаил Яковлев
Ну навязывать такой подход я и не предлагаю... Так, опционально.
Зачем по всему коду? В catch'е можно выводить вполне вкусный MessageBox, вполне конкретно указывающий, где исключение. И никаких отладчиков не надо. Смотрите на код в моем вопросе. Там почти на каждую строку получается по try-catch. Поэтому даже без отладки и при неуправляемом коде вполне реально, чтобы в тексте мессейджбокса указывалась строка с ошибкой.
Зачем по всему коду? В catch'е можно выводить вполне вкусный MessageBox, вполне конкретно указывающий, где исключение. И никаких отладчиков не надо. Смотрите на код в моем вопросе. Там почти на каждую строку получается по try-catch. Поэтому даже без отладки и при неуправляемом коде вполне реально, чтобы в тексте мессейджбокса указывалась строка с ошибкой.
Стабильнее но медлнее, значительно
За счет чего медленнее? Насколько? Замеры какие-нибудь производили, или с потолка взяли? С потолка и я могу.
Так вы это и сделали со своим вопросом, при подобной логике программа небудет номрально работать в любом случае ибо что она неможет что-то сделать из-за ошибки и вылет, или он несомжет что-то сделать и просто ничего не произойдёт всёравно пользователь не рад, программа не рабоатет как должна!
А медленне ибо напмриере сли убедт спамится сообщение об ошибки пользователь даже не узнает.
Ну и в конце концов надо писать программы так что-бы они работали без ошибок, а не скрывтаь свои ошибки!
За счет чего медленнее? Насколько? Замеры какие-нибудь производили, или с потолка взяли? С потолка и я могу.
Так вы это и сделали со своим вопросом, при подобной логике программа небудет номрально работать в любом случае ибо что она неможет что-то сделать из-за ошибки и вылет, или он несомжет что-то сделать и просто ничего не произойдёт всёравно пользователь не рад, программа не рабоатет как должна!
А медленне ибо напмриере сли убедт спамится сообщение об ошибки пользователь даже не узнает.
Ну и в конце концов надо писать программы так что-бы они работали без ошибок, а не скрывтаь свои ошибки!
Михаил Яковлев
За счет чего медленнее? Насколько? Замеры какие-нибудь производили, или с потолка взяли? С потолка и я могу.
Ага, тогда каждая программа, сама того не зная, превращалась бы в индусский код...
Ты просто не представляешь, какую херню ты только что сморозил.
Ты просто не представляешь, какую херню ты только что сморозил.
Михаил Яковлев
Ага, не представляю. Я не представляю, ПОЧЕМУ это индусский код.
В коде программы этих трукатчей НЕ БУДЕТ. Они будут ТОЛЬКО в EXE в виде машинного кода. О каком индусском коде речь?
В коде программы этих трукатчей НЕ БУДЕТ. Они будут ТОЛЬКО в EXE в виде машинного кода. О каком индусском коде речь?
Похожие вопросы
- Try{ }catch c++ Можете по-простому объяснить операторы try,catch? Cпасибо
- Как понять машинный код ?(Компилятор переводит исходный код компьютерной программы в машиный код).
- В чём необходимость использования блока try catch вместо if в С++ ?
- Как правильно думать начинающему программисту? а то без логики своих действий в написании кода, толковую программу не на
- Вот, думаю стать профессиональным дизайнером.
- Вот, думаю стать профессиональным дизайнером.
- Вопрос про компиляторов ЯП Си..
- Посоветуйте компилятор (не интерпретатор!) BASIC. Он должен создавать высокоэффективный код, в отличие от Visual Basic.
- Вопрос из разряда компиляторов. На С++ написан код, генерирующий машинный код из команд на языке ассемблер.
- Почему нельзя программировать и компилировать в cmd (командная строка) ведь как-то написали ос без компилятора?