Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Abu Antos' ([info]syarzhuk)
@ 2007-07-17 16:17:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:code

Funny bug
You would think that "next line" after the condition that raises an error would be the line after "End If", not the one right after "Then"...

On Error Resume Next
Dim c As Collection
   'comment out to show the bug
   'Set c = New Collection
   'c.Add "Shit"
   'since c wasn't initialized, accessing it's property raises an error
   'you'd think that Resume Next will go to the line after End If, but...
   If c.Count > 0 Then
      MsgBox "Shit happened"
   End If


(Добавить комментарий)


[info]ppk_ptichkin@lj
2007-07-17 17:31 (ссылка)
Гы.

(Ответить)


[info]ygam@lj
2007-07-17 18:05 (ссылка)
Did you write this code?

(Ответить) (Ветвь дискуссии)


[info]syarzhuk@lj
2007-07-17 18:15 (ссылка)
Я чужой баг, основанный на этом, сегодня пофиксил.
Подумал, что если бы VB6 использовали ещё где-нибудь, кроме нашей странной компании (справедливости ради - это legacy, вся новая разработка на сишарпе), то это был бы чудный вопрос для интервью - как может быть, что код внутри IFа выполняется, когда условие IFа не евалюейтится в True?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ppk_ptichkin@lj
2007-07-17 22:25 (ссылка)
Это так и надо, или баг в VB?

(Ответить) (Уровень выше) (Ветвь дискуссии)

On Error Resume Next - зло!
[info]xpeh1@lj
2007-07-18 03:40 (ссылка)
Это так и надо, t.e. by design, так как стоит
On Error Resume Next
выполняется следующая строка, а именно
Msgbox...
Вот еще примеры:
http://www.developerfusion.co.uk/show/4325/
http://www.cpearson.com/excel/ErrorHandling.htm

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: On Error Resume Next - зло!
[info]syarzhuk@lj
2007-07-18 09:11 (ссылка)
You'd think that the 'next line' is the line after End If, not the first line in the Then block...

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: On Error Resume Next - зло!
[info]ppk_ptichkin@lj
2007-07-18 11:21 (ссылка)
Если я правильно помню, то в BASIC'e оператор есть строчка (правда, последний раз я запачкался об BASIC лет 20 назад..)

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: On Error Resume Next - зло!
[info]emeraid@lj
2007-07-19 12:50 (ссылка)
Зато теперь есть VB.NET, и можно уже перестать ругать забытый Богом BASIC. :-)

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: On Error Resume Next - зло!
[info]ppk_ptichkin@lj
2007-07-19 13:19 (ссылка)
:-)

octal forever.

(Ответить) (Уровень выше)

Re: On Error Resume Next - зло!
[info]syarzhuk@lj
2007-07-19 15:31 (ссылка)
В Vb.Net та же хрень

On Error Resume Next
If False And (Nothing.GetType().IsArray) Then
Console.WriteLine("This line should never be printed because False And anything is False")
End If

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: On Error Resume Next - зло!
[info]emeraid@lj
2007-07-19 15:35 (ссылка)
Хм, таки да. Я никогда его не употребляю, обычно использую
Try

Catch ex As Exception
'MessageBox.Show(ex.Message)
End Try

(Ответить) (Уровень выше)

Re: On Error Resume Next - зло!
[info]ppk_ptichkin@lj
2007-07-19 16:00 (ссылка)
Ну дык.

Надо полагать, NEXT был определён как следующая строчка в самом первом варианте языка, где-нибудь на светлой памяти CP/M, чтоб не сказать бОльшего. А поменять это определение таперича никак нельзя, ибо поломается газильоны газильёнбитов никому ненужных корпоратвиных макросов.

(Ответить) (Уровень выше)

Re: On Error Resume Next - зло!
[info]ppk_ptichkin@lj
2007-07-18 10:54 (ссылка)
какая, всё-таки, гадость эта ваша заливная рыба.

(Ответить) (Уровень выше)


[info]emeraid@lj
2007-07-19 15:43 (ссылка)
Вместо:
If c.Count > 0 Then
MsgBox "Shit happened"
End If

Я бы написала:
If c.Count <= 0 Then
Else
MsgBox "Shit happened"
End If

(Ответить)