Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / On Error Resume Next / 17 сообщений из 17, страница 1 из 1
28.02.2005, 00:55
    #32935596
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
Хотел проконсультироваться... В цикле вылетает ошибка (природу и характер которой я знаю), но несмотря на это мне нужно её игнорировать и продолжить цикл. Придумалось сделать вот так (вроде работает):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
On Error GoTo ErrorHandler

   For Each s As String In array
         Dim row As DataRow = DataSet11.Testtable.NewRow
         row( 0 ) = s
         row( 1 ) = "test"
         DataSet11.Testtable.Rows.Add(row)
         On Error Resume Next
    Next

ErrorHandler: Resume Next
Вопрос: такое решение приемлемо, или есть методы изощерённее и лучше???
...
Рейтинг: 0 / 0
28.02.2005, 05:28
    #32935630
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
vladgrig
В цикле вылетает ошибка (природу и характер которой я знаю), но несмотря на это мне нужно её игнорировать

ИМХО
это высказывание настораживает... On Error - пережиток старого. Какая ошибка у вас возникает, может быть следует разобраться с ней?

Что вы разрабатываете - библиотека классов? рабочая программа? что то еще?

Уверенны ли вы что если "проглотите" все исключения то сможете корректно продолжать выполнение кода дальше?

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
28.02.2005, 08:37
    #32935709
On Error Resume Next
То что в VB.NET для совместимости оставили On Error — вовсе не значит что его нужно использовать. Resume Next вообще вещь вредная, поскольку скрывает проблемы. Лучше поставить Try..Catch и проанализировать — что за исключение возникает и почему.
...
Рейтинг: 0 / 0
28.02.2005, 08:48
    #32935723
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
авторЧто вы разрабатываете - библиотека классов? рабочая программа? что то еще?
Уверенны ли вы что если "проглотите" все исключения то сможете корректно продолжать выполнение кода дальше?

1. Рабочая программа.
2. Абсолютно.
авторЛучше поставить Try..Catch и проанализировать — что за исключение возникает и почему.
В цикле вылетает ошибка (природу и характер которой я знаю).

P.S. Вопрос не снят...
...
Рейтинг: 0 / 0
28.02.2005, 09:04
    #32935737
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
2. Абсолютно.

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


В цикле вылетает ошибка (природу и характер которой я знаю).

Дак скажите нам какая, последуйте совету Никита А. Зимин и привидите текст Exception

Совет: Забудьте про On Error - это одна из тех не нужных вещей которую оставили басистам.

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
28.02.2005, 09:21
    #32935763
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
авторДак скажите нам какая
Хорошо, можете начинать издеваться
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
On Error GoTo ErrorHandler

   For Each s As String In array
         Dim row As DataRow = DataSet11.Testtable.NewRow
        
         '*********************************
         row( 0 ) = s ' в таблице это поле ключевое (причём не автономер, а 
'простая строка), значения всавляемые в неё беруться из (предположим 
'списка), который содержит как новые (уникальные) значения, так и старые 
'(уже существующие). При попытке добавления старых вылетает exception 
'о не уникальности значения. Вот собственно и всё...
         '*********************************
        
         row( 1 ) = "test"
         DataSet11.Testtable.Rows.Add(row)
         On Error Resume Next
    Next

ErrorHandler: Resume Next
P.S. Готов выслушать ваши смешки в свой адрес, но, лучше деловые предложения...
...
Рейтинг: 0 / 0
28.02.2005, 10:34
    #32935888
On Error Resume Next
Конкретное предложение: изменить текст вот таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Try
   For Each s As String In array
         Dim row As DataRow = DataSet11.Testtable.NewRow
         row( 0 ) = s
         row( 1 ) = "test"
         DataSet11.Testtable.Rows.Add(row)
         On Error Resume Next
    Next
Catch ex As Exception
    Beep
End Try
Поставить точку останова на Beep, запустить в отладчике, когда остановится на Beep - скопировать сообщение и stack trace и поместить в форум.
А еще почитать про грамотную обработку исключений и отладку в VB.NET.
...
Рейтинг: 0 / 0
28.02.2005, 11:12
    #32935973
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
авторПоставить точку останова на Beep, запустить в отладчике, когда остановится на Beep - скопировать сообщение и stack trace и поместить в форум.
Это не новость, работа с try как то более менее понятна и без beep. Я даже знаю о существовании msgbox(ex.ToString) и добавлении на форум картинки exception. Только это не решение (вроде понятно написал какой ex и для чего On Error Resume Next).
Ладно попробую по другому:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 For Each s As String In array

        If   '*********************************
 ' как проверить что в DataSet11.Testtable в колонке с ключевыми 
 ' значениями (Column(0))  уже есть значение s (насчет перебора в цикле я 
 'тоже знаю - нехочу перебирать) и, если нет, то выполнить следующий код???    

             Dim row As DataRow = DataSet11.Testtable.NewRow
             row( 1 ) = "test"
             DataSet11.Testtable.Rows.Add(row)
        End If    '*********************************

Next
P.S. Фууу... Загрузился Думаю теперь понятно???
...
Рейтинг: 0 / 0
28.02.2005, 11:55
    #32936071
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
набиваю код прямо тут так что не пинай...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
...
For Each s As String In array

        If   not Exist(s) then 
             Dim row As DataRow = DataSet11.Testtable.NewRow
             row( 1 ) = "test"
             DataSet11.Testtable.Rows.Add(row)
        End If    '*********************************

Next
...

function Exist(Value$) as Boolean
'если Columns(0) конечно определено как PrimaryKey
 return not (DataSet11.Testtable.Rows.Find(Value) is Nothing)
end function
...
Рейтинг: 0 / 0
28.02.2005, 12:20
    #32936141
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
To Лиман Артём
Спасибо за идею.
автортак что не пинай...
Самому бы в живых остаться
Вот интересно, а встроенной функции для таких целей в Fraimwork (типо: "If DataSet11.Testtable.Columns.Item(0).IsUnique(s)" - нет студии под рукой, проверил бы) случайно нет???
...
Рейтинг: 0 / 0
28.02.2005, 20:28
    #32937351
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
Код: plaintext
1.
2.
3.
4.
5.
6.
For Each s As String In array
        If   DataSet11.Testtable.Rows.Find(s) is Nothing then 
             Dim row As DataRow = DataSet11.Testtable.NewRow
             row( 1 ) = "test"
             DataSet11.Testtable.Rows.Add(row)
        End If
Next
Да, чего то я со встроенной функцией притормозил: DataSet11.Testtable.Rows.Find(s) - это она и есть (Артём, спасибо!!!).
И, всё же, за решением своей траблы отвлёкся от основной темы:
авторOn Error - пережиток старого
это понятно, но, как используя Try Catch обработать ошибку и вернуться в цикл???
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Try
  For each lalalalala
     'Error
  Next
Catch ex as Exception
  'пнуть пользователя по ноге
  вернуться в тело цикла и продолжить его выполнение
End Try
...
Рейтинг: 0 / 0
28.02.2005, 21:15
    #32937400
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
Вызов исключения дорого стоит и для таких вещей не применяется. В данном случае вы должны обработать исключение (например, показать пользователю красивое сообщение о том что существует нарушение в данных и например, запротоколировать эту ошибку).

Т.е. изначально у вас неправильно стоит цель, вы должны не допустить здесь исключения, путем проверки своих данных (см. пост Лиман Артем )

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
28.02.2005, 21:49
    #32937423
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
авторТ.е. изначально у вас неправильно стоит цель, вы должны не допустить здесь исключения
Sa - я Вас очень уважаю (и Ваши мнения, соответственно - тоже). Но, почему то в Ваших словах чувствуется нарушение логики (на мой взгляд). С одной стороны - вы должны не допустить здесь исключения - тогда на кой использовать try catch??? С другой стороны - произошла внештатная ситуация - тогда первое суждение ложно.
Ну да ладно - простой пример - копирование файлов из одной директории в другую. Поймали ex о том что не может он скопировать один файл (по любой причине), зачем прерывать всё копирование??? Не логичнее, зная о том, что файл "ляляляля" скопировать не удалось (даже - запротоколировать эту ошибку), скопировать всё остальное, а с этим злополучным файлом разбираться потом отдельно???
...
Рейтинг: 0 / 0
28.02.2005, 22:47
    #32937460
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
В данном случае надо разделять что понимать под исключительной ситуацией, если для логики моего приложения невозможность копирования одного из файлов является нарушением работы, то я должен инициировать исключение и отменить процесс копирования.

Если для меня это не критично то я и не буду вызывать исключение для этой ситуации и продолжу копировать дальше.

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

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
28.02.2005, 23:26
    #32937483
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
Со своей ситуацией я уже разобрался с помощью Артёма (и благодарность ему уже высказал).
Кстати и с проблемой, по моему тоже:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  For each lalalalala
        Try
           
             'Error

        Catch ex as Exception
             обрабатываем исключение по своему усмотрению
             ' из тела цикла мы и не выходили :)))
        End Try
  Next
P.S. Всем спасибо за помощь, тема закрыта (оказывается и сам могу, если направят в нужное русло )
...
Рейтинг: 0 / 0
01.03.2005, 06:39
    #32937604
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
Код: plaintext
1.
Catch ex as Exception
Только с этим не злоупотребляйте, максимально уточняйте тип исключения, то есть например для ошибок с копированием файлов, один из фильтров мог бы быть:
Код: plaintext
1.
Catch ex as IOException

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
01.03.2005, 09:02
    #32937735
vladgrig
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On Error Resume Next
Sa, спасибо.
В завершении всего процесса ликвидации моих пробелов в знаниях, хотел бы привести код с примером (может не самым удачным, но всё же ). Вдруг кто то встретится с проблемой - а так, посмотрит ("поймает идею") и, глядишь, по аналогии сделает быстрее и эффективнее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click

        Dim x As Integer =  0 
        Dim y As Integer

        For i As Integer =  1  To  5 
            Try
                y = i / x ' деление на ноль вызовет Error
            Catch ex As ArithmeticException
                   Dim response As MsgBoxResult = MessageBox.Show("Вероятно Вы
                   пытаетесь разделить " & i & " на ноль." & vbCrLf & "Это
                   недопустимая операция".PadLeft( 38 ), "Ooops...",
                   MsgBoxStyle.AbortRetryIgnore)
                Select Case response
                    Case MsgBoxResult.Abort
                        Exit Sub
                    Case MsgBoxResult.Retry
                        i -=  1 
                    Case MsgBoxResult.Ignore
                        Exit Select
                End Select
            Catch ex As Exception ' здесь можно присвоить ex свой тип исключения
                MsgBox("Some other problems")
            End Try
        Next

End Sub
P.S. Надеюсь понятно, что в Try......Catch Можно подставить свой проблемный код и, обрабатывать ошибку уже по своему...
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / On Error Resume Next / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]