|
HTTPСоединение - как получить код ответа 404? Выпадает исключение | ☑ | ||
---|---|---|---|---|
0
romix
17.04.15
✎
13:27
|
Для несуществующих ссылок всегда возвращает исключение.
Похожая тема: v8: HTTPСоединение как получить код ответа Там советуют использовать WinHttpRequest. Но может быть HTTPСоединение как-то можно заставить возвращать код 404? |
|||
1
Поpyчик-4
17.04.15
✎
13:41
|
Попытка
ответ=Соединение.Получить(АдресСсылки); Исключение КонецПопытки; кодОтвета=ответ.КодСостояния; Если кодОтвета=404 Тогда Сообщить("Атас!"); КонецЕсли; |
|||
2
romix
17.04.15
✎
16:24
|
(1) Этот код не работает:
ответ.КодСостояния {(1)}: Значение не является значением объектного типа (КодСостояния) |
|||
3
oleg_km
17.04.15
✎
16:48
|
Зачем заставлять возвращать код, если для этого разработчики решили использовать исключение? Используй исключение, у мелкомягких в .NET тоже вроде выскакивает исключение, если 400 или 500, и на Java вроде тоже. Так что 1С в майнстриме.
|
|||
4
romix
17.04.15
✎
17:50
|
(3) Я получаю статус документа, переданного в базу бухгалтерии (проведен, не проведен).
Если документ еще не передан (его нет в бух. базе), то 1С бухгалтерии возвращает 404. Это штатный механизм OData от 1С. Хочется различать ситуации, когда документа нет (штатные) и разные внештатные ситуации, на которые надо выдавать ужасное красное исключение. |
|||
5
ДенисЧ
17.04.15
✎
17:56
|
в описании ошибки что указано?
|
|||
6
oleg_km
17.04.15
✎
20:27
|
Ну да, анализируй информацию из исключения
|
|||
7
Serginio1
17.04.15
✎
20:49
|
(3) Да в исключении ловят webResponse.StatusCode
for (int i=1; i < 1000; i++) { string id = i.ToString(); try { string url_source = get_url_source("http://mysite.com/"+id); } catch(WebException ex) { HttpWebResponse webResponse = (HttpWebResponse)ex.Response; if (webResponse.StatusCode == HttpStatusCode.NotFound) { continue; } else { throw; } } } |
|||
8
Serginio1
17.04.15
✎
20:51
|
||||
9
oleg_km
18.04.15
✎
17:05
|
О, а надо в нашу обертку как-нибудь впихнуть, чтобы можно было получить объект Exception, через утиную типизацию приводить его к нужному типу, к WebException в данном случае
|
|||
10
Serginio1
18.04.15
✎
23:57
|
Можно сделать обертку для выполнения
(HttpWebResponse)request.GetResponse(); Но надо посмотреть как вообще исключения прикрутить |
|||
11
Serginio1
19.04.15
✎
00:15
|
Можно сохранять в статической переменной исключение
|
|||
12
oleg_km
19.04.15
✎
00:17
|
Ну да. Я так и хотел
|
|||
13
Serginio1
19.04.15
✎
00:38
|
Но лучше сделать класс обертку внутри которого выполнять метод, где одним полем будет как раз поле ошибки.
|
|||
14
romix
30.04.15
✎
01:18
|
Так или иначе, а код ошибки то не получить никак - 1С прыгает в исключение, где поле с кодом уже недоступно.
Что-то содержащее 404 можно прочитать в тексте описания ошибки. Но это же придется пользователю вываливать, или текст парсить. Жалобу что ли им в поддержку напейсать... |
|||
15
Serginio1
28.05.15
✎
11:28
|
(9) Сделал. Можно использоваь так. Чуть позже выложу
врап=новый COMОбъект("NetObjectToIDispatch45"); врап.ВыводитьСообщениеОбОшибке=ложь; NotFound=Врап.ПолучитьТип("System.Net.HttpStatusCode").NotFound; url="http://www.forum.mista.ru/"; попытка сообщить(Лев(ПолучитьДанныеССайта(врап,url),50)); Исключение Ошибка=врап.ПоследняяОшибка; сообщить("Код ошибки "+Ошибка.Response.StatusCode); конецпопытки; сообщить("====================="); попытка сообщить(ПолучитьДанныеССайта(врап,url+"topic.php?rd=0025")); исключение Ошибка=врап.ПоследняяОшибка; сообщить("Код ошибки "+Ошибка.InnerException.Response.StatusCode.ToString()); Сообщить(Ошибка.InnerException.Response.StatusCode.Equals(NotFound)); конецпопытки |
|||
16
Dunemaster
28.05.15
✎
12:00
|
(15) Ужас какой.
Достаточно использовать HTTPСоединение и в качестве аргумента методу Получить передать HTTPЗапрос ( |
|||
17
oleg_km
28.05.15
✎
12:09
|
(15) Там основная проблема когда сбрасывать свойство ПоследняяОшибка, потому что может быть уже непонятно к какому вызову оно относилось. И я это хотел вообще положить в AutoWrap, Invoke там же выполняется.
(16) Мальчик, проходи мимо. (шутка) |
|||
18
Serginio1
28.05.15
✎
12:23
|
(17) Ну в попытке ты получишь только последнюю ошибку.
Посмотри http://files.rsdn.ru/19608/FilesForNetObjectToIDispatch.zip |
|||
19
Serginio1
28.05.15
✎
12:25
|
Там такая реализация
public class AutoWrap : IReflect { public static bool ЭтоСемерка = false; public static bool ВыводитьСообщениеОбОшибке = true; public static Exception ПоследняяОшибка = null; при исключении вызова метода if (ЭтоТип) obj = T.InvokeMember(name, invokeAttr, binder, null, args, modifiers, culture, namedParameters); else obj = T.InvokeMember(name, invokeAttr, binder, O, args, modifiers, culture, namedParameters); } catch (Exception e) { ПоследняяОшибка = e; |
|||
20
Serginio1
28.05.15
✎
12:26
|
Ну и соответственно во врайпере
public object ПоследняяОшибка { get{return new AutoWrap(AutoWrap.ПоследняяОшибка);} } |
|||
21
Serginio1
28.05.15
✎
12:28
|
Да при исключении выбрасывается комовское исключение
catch (Exception e) { ПоследняяОшибка = e; string Ошибка = "Ошибка в методе " + name + " " + e.Message + " " + e.Source; if (e.InnerException != null) Ошибка = Ошибка + "\r\n" + e.InnerException.ToString(); if (ВыводитьСообщениеОбОшибке) { MessageBox.Show(Ошибка); MessageBox.Show(e.StackTrace); MessageBox.Show(invokeAttr.ToString()); } throw new COMException(Ошибка); } |
|||
22
Serginio1
28.05.15
✎
12:30
|
(16) Я Ужаса никакого не вижу вот код
WebRequest=врап.ПолучитьТип("System.Net.WebRequest"); request= WebRequest.Create(url); response = request.GetResponse(); sr = Врап.СоздатьОбъект("System.IO.StreamReader",response.GetResponseStream()); return sr.ReadToEnd(); |
|||
23
oleg_km
28.05.15
✎
14:32
|
(22) Для меня главное, что у NET - миллионы вопящих, топающих ногами и требующих немедленно исправить выявленные баги тестеров, а не то они уйдут на Java и пр. А у 1С горстка заложников системы разработки, которых вполуха слушают, а вообще пусть хавают что дают. Старший сам знает, что им надо.
|
|||
24
Serginio1
28.05.15
✎
14:56
|
(23) Если честно, то я удивляюсь тому, что через нетовские классы можно решить кучу задач, но народ будет делать все через задницу, чем применят эту обертку. Я сам довольно часто ей пользуюсь, в том числе и на семерке.
При этом я не могу понять, сейчас C# вообще что ли не изучают? Народ сразу на 1С начинает программировать? |
|||
25
oleg_km
28.05.15
✎
15:57
|
(24) А очень мало на мой взгляд на 1С программистов. У нас сейчас работает молодой специалист, он имеет представление о программировании. До этого один бы радиоинженер, подключал интернет, понял что на 1С можно больше зарабатывать. Другой бросил институт и все эти абстракции и тоже кинулся денег зарабатывать. Они даже не заморачивались с повторным использованием кода, просто копипастили. Ну и откуда у них знание и желание изучать C#? Проще найти работу, где ничего этого не надо будет.
|
|||
26
Serginio1
28.05.15
✎
18:02
|
(25) Да уж
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |