|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
Переменная, объявленная в блоке Try - Catch видна не для всего метода25.12.2012, 23:51. Показов 12966. Ответов 21
Метки нет (Все метки)
Спасибо, кто откликнется.
0
|
||||||
| 25.12.2012, 23:51 | |
|
Ответы с готовыми решениями:
21
Try-Catch: чтобы падение в одной строке не приводило к падению всего метода
Не видна переменная, объявленная в Form1 |
|
27 / 27 / 12
Регистрация: 11.11.2009
Сообщений: 86
|
|
| 26.12.2012, 00:46 | |
|
Если твой try не выполнится, dataOut не присвоено значение, а в finally ты пытаешься закрыть dataOut, а закрывать то нечего.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
| 26.12.2012, 02:11 [ТС] | ||||||
|
Очень может быть, да только вот беда, эти соображения здесь не срабатывают:
0
|
||||||
|
27 / 27 / 12
Регистрация: 11.11.2009
Сообщений: 86
|
||||||
| 26.12.2012, 02:19 | ||||||
|
Почему же ? try здесь выполнилнится полюбому и значит значение dataOut присвоется, а по этому
0
|
||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||||||||
| 26.12.2012, 02:30 [ТС] | ||||||||||||
|
Вот try из первого поста:
0
|
||||||||||||
|
27 / 27 / 12
Регистрация: 11.11.2009
Сообщений: 86
|
|
| 26.12.2012, 02:44 | |
|
Второй раз фигню написал, так как плохо посмотрел что к чему.
Все переменные в с# должны быть инициализированы при работе с ними поэтому, в первом случае где 1 try, выдается ошибка, вдруг try не выполнится, а в finally будет закрываться не инициализированая переменная(хоть dataOut можно и закрыть), не делали исключений в языке. Второй try работает так как dataOut можно закрывать.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 26.12.2012, 03:09 [ТС] | |
|
Всё равно не понятно. В первом примере не компилит потому, что dataOut неинициализирована, а во втором компилит не потому, что dataOut ИНИЦИАЛИЗИРОВАНА, а потому, что оказывается есть второй блок try
Так как-нибудь надо нам определиться вместе с компилятором. Либо мы смотрим на инициализацию переменной и в зависимости от этого компилим или нет Либо смотрим на наличие блока try и в зависимости от этого компилим или нет А то в одном коде у нас так, в другом эдак. Ничё нет в этом мире постоянного!
0
|
|
|
|
||
| 26.12.2012, 07:27 | ||
|
Во втором случае вариантов 2: 1. проходим успешно 1-й блок try -> попадаем в finally второго блока 2. вылетает ошибка в 1-м блоке try -> попадаем в catch первого блока -> return В обоих случаях можно быть точно уверенным, что если попадем в finally второго блока - то переменная dataOut, будет точно инициализирована.
1
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||||||
| 26.12.2012, 08:16 | |||||||||||
|
Ну или так:
0
|
|||||||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 26.12.2012, 14:18 [ТС] | |||||||
|
........................................ ................ Вот вы написали: (жирным я выделил заменённые слова, ибо речь шла о двух блоках trу, а у меня один) 1. проходим успешно 1-й блок try -> попадаем в finally первого блока 2. вылетает ошибка в 1-м блоке try -> попадаем в catch первого блока -> return В обоих случаях можно быть точно уверенным, что если попадем в finally первого блока - то переменная dataOut, будет точно инициализирована.
мы попадаем в finally и dataOut оказывается неинициализирована и потому не компилит... Что ж за вариант-то такой, не подскажите?
0
|
|||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 26.12.2012, 14:22 | ||
|
FileStream выбрасывает исключение по какой-то причине, объект не создается, переменная остается не проинициализирована, вы сразу же переходите в блок catch, а оттуда в finally. Об этом варианте вам и сообщает компилятор.
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 26.12.2012, 14:29 [ТС] | |||||||
0
|
|||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 26.12.2012, 14:34 | |||||||
|
Блок finally на то и finally, что выполняется в любом случае, не приводящем к принудительному завершению приложения. В вашем примере сначала выполнится то, что в блоке finally, а потом уже будет return:
0
|
|||||||
|
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
|
||||||
| 26.12.2012, 14:34 | ||||||
з.ы. а 3й вариант тут видно невооруженным взглядом - другой Exception отличный от IOException
0
|
||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||||||||
| 26.12.2012, 15:21 [ТС] | ||||||||||||
тут после блока finally должна быть надпись "после всего", но её нет, поскольку(???) в catch присутствует return
И даже поведение программы не основание так думать (ибо сами понимаете, это всё частные случаи). У меня в книге чётко расписано чё как и зачем действует. И пункта, что "если в catch обнаружен оператор return, то программа выполнит его после того, как выполнит блок finally" нет. Опыт вещь орошая. но хотелось бы об этом прочесть где-нибудь. Добавлено через 6 минут а вот и порядок выполнения блоков подоспел, я там жирным выделил чё надо
>> Выполнение блока try останавливается в точке, где возникло исключение.
>> Если существует какой-нибудь блок catch, выполняется проверка, соответствует ли этот блок типу сгенерированного исключения. Если блока catch нет, выполняется блок finally (который, если нет ни одного блока catch, должен присутствовать обязательно). >> Если блок catch существует, но не тот, выполняется проверка, существуют ли другие подходящие блоки catch. >> Если имеется совпадающий с типом исключения блок catch, выполняется содержащийся в нем код, после чего выполняется блок finally, если он есть. >> Если не обнаружено ни одного совпадающего с типом исключения блока catch, выполняется блок кода finally, если он есть.
0
|
||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||
| 26.12.2012, 15:33 | ||||
|
Сначала выполняется код в catch, но если частью этого кода является команда, выводящая выполнение за пределы блока, то сначала делается ответвление на блок finally, после чего выполнение уже переходит туда, куда нужно. Согласно спецификации, выполнение блока finally гарантируется в любом случае, не приводящем к полному завершению приложения - как ни пытайтесь его "обойти".
1
|
||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||
| 26.12.2012, 17:03 [ТС] | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 3
|
||||||
| 27.03.2017, 14:17 | ||||||
|
Рискну поднять старую тему.
Подскажите, как решить конкретную задачу. В функцию передается строка -- путь к папке. В хочу создать новую переменную с типом DirectoryInfo и дальше с ней поработать. Проблема в том, что при создании может выпасть исключение т.к. в строке может быть не путь к папке, а любая ерунда (т.к. данные вводит пользователь). Если исключение выпадает -- выходим из метода. Как отрабтать такую ситуацию? Код ниже выдает ошибку в последней строке.
0
|
||||||
|
69 / 69 / 28
Регистрация: 12.09.2013
Сообщений: 237
|
||||||
| 27.03.2017, 14:31 | ||||||
|
PavelAl,
TryКак результат, Метод Dir Вернет, либо строку с ошибкой, либо DirectoryInfo
0
|
||||||
|
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 3
|
|
| 27.03.2017, 14:58 | |
|
Я специально написал что пример с return очень условный. На самом деле там идет плотная работа с папкой, файлы копируются, удаляются, есть еще попытки...
Я понял, что можно вытащить DirectoryInfo в отдельный метод, только ради того, что бы ее безопасно определить, но мне видится, что это какой то костыль. Выше обсуждалось, что компилятор как то понимает, что ошибки не может возникнуть (как в моем примере) -- либо, если в try ошибка, мы выходим из метода с ошибкой и не доходим до второго return, а если дошли, то значит ошибки не было и переменные определены. Хотя это и не соответствует документации. Так вот, вопрос, если я после объявления хочу работать с "di" долго и упорно, единственный вариант "безопасно" ее определить -- вытаскивать определение в отдельный метод?
0
|
|
| 27.03.2017, 14:58 | |
|
Помогаю со студенческими работами здесь
20
Проблема с возвращающим значением метода в блоке try-catch Переменная объявленная на другой форме Почему компилируется не объявленная переменная в шаблоне? Почему переменная объявленная static работает не корректно? Ошибка в с try - catch блоке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|