Естетсвенно при компиляции получаем ошибку 'foo': not all code paths return a value. Причем иногда в километровом тексте лапши понять в каком именно парте компилятор не нашел выход бывает весьма трудно. Кроме того, и это наиболее неприятно, приходится добавлять незначимые return-ы, что очень замутняет понимание и без того не прозрачного кода. Может имеется како-то другой паттерн для таких случаев (ну, кроме явного раскрытия ThrowException — это однозначно не подходит, т.к. ф-ция более нетривиальна, чем в примере)?
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Здравствуйте, __gas, Вы писали:
__>Может имеется како-то другой паттерн для таких случаев (ну, кроме явного раскрытия ThrowException — это однозначно не подходит, т.к. ф-ция более нетривиальна, чем в примере)?
Вместо ThrowException(<набор различных параметров>); пишем
throw NewException(<набор различных параметров>);
"Как я сам не дотумкал!" (с). В общем-то так и стану, наверное, все переделывать, да только таких мест уж больно много в коде сидит . Хотелось бы какого-нибудь атрибута на ф-цию, который бы говорил компилятору, чтЖ(она бросает исключение во всех случаях.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Костыль явно не подходит, т.к. типов возврата, как правило, более одного. Изящнее выглядит предложение Aen Sidhe. Но еще более изящным(IMHO) было бы использование специальных compile-time атрибутов на throw-функции
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Еще одна засада в том, что данная функция используется еще в стопятьсот местах, где пути выхода из методов не зависят от ее использования. Это осложняет рефакторинг, т.к. надо не проворонить все места такого использования. Ведь теперь она сама ничего бросать не станет и тогда килотонне кода придет крантец.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
__>Еще одна засада в том, что данная функция используется еще в стопятьсот местах, где пути выхода из методов не зависят от ее использования. Это осложняет рефакторинг, т.к. надо не проворонить все места такого использования. Ведь теперь она сама ничего бросать не станет и тогда килотонне кода придет крантец.
Решарпер поможет. Find Usage — очень удобная функция, а за месяц триала отрефакторить успеете, я думаю.
__>Еще одна засада в том, что данная функция используется еще в стопятьсот местах, где пути выхода из методов не зависят от ее использования. Это осложняет рефакторинг, т.к. надо не проворонить все места такого использования. Ведь теперь она сама ничего бросать не станет и тогда килотонне кода придет крантец.
__>>Еще одна засада в том, что данная функция используется еще в стопятьсот местах, где пути выхода из методов не зависят от ее использования. Это осложняет рефакторинг, т.к. надо не проворонить все места такого использования. Ведь теперь она сама ничего бросать не станет и тогда килотонне кода придет крантец.
AS>Решарпер поможет. Find Usage — очень удобная функция, а за месяц триала отрефакторить успеете, я думаю.
Можно и без Решарпера. ThrowException переименуем в NewException, игнорируя предложения студии в рефакторинге, потом пытаемся скомпилить. Получим кучу Error-ов. В месте каждой ошибки заменяем "ThrowException" на "throw NewException".
Здравствуйте, __gas, Вы писали:
__>Здравствуйте, Aen Sidhe, Вы писали:
AS>>Решарпер поможет. Find Usage — очень удобная функция, а за месяц триала отрефакторить успеете, я думаю.
__>С нашим отделом тестирования нужна вечность триала . Вот вроде бы неплохое (хоть и некрасивое) решение:
__>
__> static Exception ThrowException(<blabla>)
__> {
__> var e = new Exception();
__> switch(e != null)
__> {
__> case true:
__> throw e;
__> default:
__> return e;
__> }
__> }
__>
Решение чего?
__>Тогда ThrowException можно юзать и так и сяк и без исправления в куче мест: __>
__>throw ThrowException(<....>); //используется по-умному в новых местах кода
__>ThrowException(<....>); //Обеспечивается совместимость со старой лапшой
__>
Совместимости не будет. Кто возбудит исключение-то?
Здравствуйте, samius, Вы писали:
S>Здравствуйте, __gas, Вы писали:
S>Опять я опоздал
Теперь Вы явно поспешили .
S>Совместимости не будет. Кто возбудит исключение-то?
var e = new Exception();
switch(e != null)
{
case true:throw e;
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Здравствуйте, __gas, Вы писали:
__>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, __gas, Вы писали:
S>>Опять я опоздал __>Теперь Вы явно поспешили .
S>>Совместимости не будет. Кто возбудит исключение-то?
__>
__>var e = new Exception();
__>switch(e != null)
__>{
__> case true:
__> throw e;
__>
Здравствуйте, samius, Вы писали:
S>эээ, понятно. А для чего проверка-то?
Ну это типа финт ушами (потому и некрасивое решение). Просто иначе return e воспримется компилятором как недостижимый код — а это лишнее предупреждение, которое в релизе будет зачтено за ошибку. Можно, конечно и условной компиляцией побаловаться, или отключением ворнинга, но это вообще не гуд.
Основной недостаток в использовании такой ф-ции заключен в том, что компилятор не распознает недостижимый код после нее. Соответственно потенциальные UB и опять же неудовлетворительное автодокументирование кода.
Как известно, 90% людей верят утверждениям, начинающимся со слов «как известно».
Здравствуйте, __gas, Вы писали:
__>Здравствуйте, samius, Вы писали:
S>>эээ, понятно. А для чего проверка-то?
__>Ну это типа финт ушами (потому и некрасивое решение). Просто иначе return e воспримется компилятором как недостижимый код — а это лишнее предупреждение, которое в релизе будет зачтено за ошибку. Можно, конечно и условной компиляцией побаловаться, или отключением ворнинга, но это вообще не гуд.
__>Основной недостаток в использовании такой ф-ции заключен в том, что компилятор не распознает недостижимый код после нее. Соответственно потенциальные UB и опять же неудовлетворительное автодокументирование кода.
Можно было бы сделать throw без проверки, и потом, после исправления всех мест использования, вместо throw в методе заменить return-ом.
Здравствуйте, Aen Sidhe, Вы писали:
__>>В программе довольно часто используется такой паттерн:
__>> throwThrowException(<набор различных параметров>);
throw внутри хелпера не просто что бы затруднить использование кода. Метод, в котором есть throw с большой долей вероятности не будет заинлайнен, тогда как даже достаточно развесистые но простые методы a-la