Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: Пропустить часть ошибок Добавлено: 15.05.09 18:05  

Автор вопроса:  AWР | Web-сайт: bomber.h17.ru | ICQ: 345685652 

Ответить

  Ответы Всего ответов: 61  

Номер ответа: 16
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #16 Добавлено: 16.05.09 12:49
_Serega пишет:
Почему нельзя использовать, если он работает и в чем принципиальная разница?

Потому что это унаследованная конструкция и оставлена исключительно для совместимости со старым кодом, который переносится с VB6, она не отвечает идеологии .NET

VBD пишет:
Так и реализован. Тупо пишешь и все. Между прочим иногда очень полезно оказывается. Наверно когда-нибудь станет ключевым словом.

Копни глубже

Ответить

Номер ответа: 17
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #17 Добавлено: 16.05.09 13:10
_Serega пишет:
аргументировать? Я аргументы от мелкософта читал, но принципиальной разницей не проникся, все больше похоже на рекламацию для продвижения .Net технологии, но не покупаться же на это. Может быть конечно, что не ту книжку прочитал или вообще чот не догоняю, но в общем то проблем нет, для этого и общаемся, чтоб иметь общий опыт, который всегда больше, чем опыт каждого в отдельности.

Что именно аргументировать?
On Error Resume Next это не обработка ошибок, а, скорее, их "гашение" - конструкция которая просто не дает коду упасть с исключением.

Визуально никаких ошибок, разумеется, не будет, впрочем ценность кода это сводит к 0.

Про то что нагляднее я согласен, но вот насчет вложенного обработчика, ту вот чего думаю.
В общем "на пальцах", как понимаю, что такое Try Catch - который пришел в Vb.Net от C++...
К примеру обращаемся к файлу через API и вдруг он не открывается, возникает ошибка и С++ позволял считать код ошибки, который соответствовал ответу HResult c соответствующим кодом, именитая интеграция с системой в этом и заключается! А вот обработчик ошибок в VB не считывал этот код автоматом и тут как бы раработчик на С++ получал "преимущество", потаму что мог обработать ошибку по коду, а так ли это на самом деле? Вот делая вызов считаваем тот же возврат от HResult - мне к примеру интересно, почему его не читают, ведь его сама функция вызова и возвращает и ты уже или умеешь этот код ошибки в алгоритме обработать или нет, а то что тебе возвращает этот же код ошибки обработчик ошибок при перехвате ошибок, ну вроде как удобство, но так ли необходимое, если HResult и так считывается при вызове? Структурная обработка ошибок подразумевает алгоритм решение ошибки, а принимаешь решение что делать по ВОЗВРАЩЕННОМУ КОДУ, важно знать, что делать именно с ЭТИМ КОДОМ ОШИБКИ, а сам код и возможность обработки ошибки одинаково получаешь и в первом и во втором случае.

С++ здесь не при чем.

В .NET не используются коды ошибок, используются типизированные исключения. Советую внимательнее почитать про обработку ошибок в .NET.
Ошибки могут происходить не только при вызове АПИ-функций.

Ответить

Номер ответа: 18
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #18
Добавлено: 16.05.09 14:52
напишем следующее
  1. On Error Resume Resume Next
  2. Dim i as Integer = 5
  3. i = i / 0


и посмотрим во что же компилятор превратил сию конструкцию:
  1. Dim VB$ResumeTarget As Integer
  2.     Try
  3.         Dim VB$CurrentStatement As Integer
  4.     Label_0000:
  5.         ProjectData.ClearProjectError
  6.         Dim VB$ActiveHandler As Integer = -2
  7.     Label_0008:
  8.         VB$CurrentStatement = 2
  9.         Dim i As Integer = 5
  10.     Label_000C:
  11.         VB$CurrentStatement = 3
  12.         i = CInt(Math.Round(CDbl((CDbl(i) / 0))))
  13.         goto Label_0088
  14.     Label_0023:
  15.         VB$ResumeTarget = 0
  16.         Select Case (VB$ResumeTarget + 1)
  17.             Case 1
  18.                 goto Label_0000
  19.             Case 2
  20.                 goto Label_0008
  21.             Case 3
  22.                 goto Label_000C
  23.             Case 4
  24.                 goto Label_0088
  25.             Case Else
  26.                 goto Label_007D
  27.         End Select
  28.     Label_0043:
  29.         VB$ResumeTarget = VB$CurrentStatement
  30.         Select Case IIf((VB$ActiveHandler > -2), VB$ActiveHandler, 1)
  31.             Case 0
  32.                 goto Label_007D
  33.             Case 1
  34.                 goto Label_0023
  35.         End Select
  36.     Catch obj1 As Object When (?)
  37.         ProjectData.SetProjectError(DirectCast(obj1, Exception))
  38.         goto Label_0043
  39.     End Try
  40. Label_007D:
  41.     Throw ProjectData.CreateProjectError(-2146828237)
  42. Label_0088:
  43.     If (VB$ResumeTarget <> 0) Then
  44.         ProjectData.ClearProjectError
  45.     End If


а теперь напишем:
  1. Try
  2.             Dim i As Integer = 5
  3.             i = i / 0
  4.         Catch ex As Exception
  5.         End Try


и что же получилось?:
  1. Try
  2.         Dim i As Integer = 5
  3.         i = CInt(Math.Round(CDbl((CDbl(i) / 0))))
  4.     Catch exception1 As Exception
  5.         ProjectData.SetProjectError(exception1)
  6.         Dim ex As Exception = exception1
  7.         ProjectData.ClearProjectError
  8.     End Try



ну как?

Ответить

Номер ответа: 19
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #19 Добавлено: 16.05.09 15:01
Skywalker, приложение виндовое?

Ответить

Номер ответа: 20
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #20
Добавлено: 16.05.09 15:21
да

Ответить

Номер ответа: 21
Автор ответа:
 _Serega



Вопросов: 1
Ответов: 43
 Профиль | | #21 Добавлено: 17.05.09 05:30
Не нравится вызов API в примере, пусть будет COM вообще, который вызывается так же через Framework, меняются интерфейсы, но работает то все так же...
"Если компоненты .Net используются в COM, то классы исключений преобразуются в разные коды HRESULT." - Это с книжки Дан Эпплмана, он кстатьи разработчик .Net
Что такое COM - это на сегодняшний день практически весь интерфейс взаимодействия программы с внешней средой, где мы и ожидаем возникновение внештатных ситуаций и готовимся к обработке части из них(об этом речь и идет), а как в примере приведено - ну не исползует никто возникновение исключения для контроля в арефметических оперциях, а пофантазировать это да - это можно.

Ответить

Номер ответа: 22
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #22 Добавлено: 17.05.09 07:04
_Serega, о чем ты?
99% .NET-овских программ не работают ни с COM, ни с API - они работают только с встроенной библиотекой классов .NET

Ответить

Номер ответа: 23
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #23 Добавлено: 17.05.09 07:13
Кстати при работе с COM ты не получишь ничего кроме COMException у которого установлен HResult и, возможно, описание ошибки

Ответить

Номер ответа: 24
Автор ответа:
 _Serega



Вопросов: 1
Ответов: 43
 Профиль | | #24 Добавлено: 17.05.09 13:21
Steel Brand, так понимаю, что если нет Frameworka и при этом эго конкретной версии, значит есть API, если мы все же в Windows, тогда на какой именно версии Framework работает WindowsXP, которая сегодня является доминирующей?))))

Ответить

Номер ответа: 25
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #25 Добавлено: 17.05.09 13:59
_Serega, если на компьютере нет .NET Framework, то программа не запустится и дальнейшие твои рассуждения неверны.

_Serega пишет:
тогда на какой именно версии Framework работает WindowsXP

Windows XP не зависит от .NET Framework какой-либо версии

Ответить

Номер ответа: 26
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #26
Добавлено: 17.05.09 15:59
Windows XP не зависит от .NET Framework какой-либо версии


Звучит пафосно :)))

Ответить

Номер ответа: 27
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #27 Добавлено: 17.05.09 20:11
VBD, в параллельном топике я жду код как унаследовать класс от String.

Ответить

Номер ответа: 28
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #28
Добавлено: 17.05.09 20:34
Жди.

Ответить

Номер ответа: 29
Автор ответа:
 _Serega



Вопросов: 1
Ответов: 43
 Профиль | | #29 Добавлено: 19.05.09 08:27
Тут ты серьезно неправ.
Windows - работает на API вызовах, а нa .Net всего лишь создается виртуальная машина, навроде как это на Java было много лет взад сделано.
Во первых иерархия виртуальной машины для .Net выглядит следующим образом (с верхнего уровня на нижний):
 
1 CLR, COM, другие библиотеки
2 WIN32 API
3 Оборудование

В вторых уровень CLR, на которой Net и крутится как правило фиксируя "чужие ошибки" просто не понимая и не признавая собственных и считая себя эталоном правильности. Мне лично пришлось не раз уже обнаруживать их в ходе программирования, начиная с гонок в простейшей арифметике - навроде вот прям с отладчика набираю:
?Csng(0.0001)* CInt(10)
0.0009999999
и мног еще чего всякого - это недавно отлаживать пришлось, от того и вспомнил первым и никаких ошибок .Net отчего то не фиксирует при этом вообще, типо проста насчитал праильно и все! В общем разницы между OnError и Try по большому счету нет, просто пиар от макрософта.

Ответить

Номер ответа: 30
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #30 Добавлено: 19.05.09 10:41
_Serega, я пишу на .NET 5 с лишним лет, твой же опыт, судя по всему, ограничивается чтением нескольких книг типа Эпплмана. Эпплман все правильно написал, но нужно понимать кто такой Эпплман, с какой целью и когда он писал эту книгу. А после этого взять и почитать настоящие книги по .NET типа Рихтера.

1 CLR, COM, другие библиотеки
2 WIN32 API
3 Оборудование

Какие такие "другие библитоеки"?

Забудь ты наконец про этот COM! COM в .NET используется очень редко, в частности при работе с HTML DOM, VSTO (интерфейсы Office почти все на COM работают, не считая нескольких классов-оберток), при расширении возможностей Windows Shell (и то в роли провайдера COM), ну может еще какие-то Legacy-компоненты которые не перенесены и не будут перенесены на .NET.

Win32API кстати тоже почти не используется (чаще при программировании под Windows Forms).

_Serega пишет:
В вторых уровень CLR, на которой Net и крутится как правило фиксируя "чужие ошибки" просто не понимая и не признавая собственных и считая себя эталоном правильности

мда...

Мне лично пришлось не раз уже обнаруживать их в ходе программирования, начиная с гонок в простейшей арифметике - навроде вот прям с отладчика набираю:
?Csng(0.0001)* CInt(10)
0.0009999999

А не судьба прочитать про то как работают типы с плавающей запятой прежде чем такие ляпы делать? Операции с плавающей запятой всегда на всех платформах во всех языках прогарммирования дают погрешность.

_Serega пишет:
и мног еще чего всякого - это недавно отлаживать пришлось, от того и вспомнил первым и никаких ошибок

Приведи примеры этого еще чего всякого.

.Net отчего то не фиксирует при этом вообще, типо проста насчитал праильно и все

жесть...

_Serega пишет:
В общем разницы между OnError и Try по большому счету нет, просто пиар от макрософта.

Блин я под столом валяюсь...

Можешь с помощью On Error ... сделать что-то типа такого?

  1.         Try
  2.             Dim Text = IO.File.ReadAllText(Path)
  3.         Catch ex As FileNotFoundException
  4.             ' Обработчик 1
  5.         Catch ex As PathTooLongException
  6.             ' Обработчик 2
  7.         Catch ex As DirectoryNotFoundException
  8.             ' Обработчик 3
  9.         Catch ex As IOException
  10.             ' Обработчик 4
  11.         Catch ex As UnauthorizedAccessException
  12.             ' Обработчик 5
  13.         Catch ex As NotSupportedException
  14.             ' Обработчик 6
  15.         Finally
  16.             ' Финализация ресурсов
  17.         End Try


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

Разницы между On Error и Try НЕТ только в том случае, если единственное для чего ты их используешь - для того чтоб погасить исключение и не дать коду упасть. Но это не обработка ошибок, это иллюзия того что код работает без ошибок.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам