Имя: Пароль:
1C
1C 7.7
v7: Как в 7.7 красиво вызывать исключение..? ☑
0 Злопчинский
 
25.02.20
✎
03:04
Есть конструкция, типа:
Попытка
  //здесь много кода
Исключение
  Сообщить(ОписаниеОшибки());
КонецПопытки;

хочется внутри //здесь много кода
породить исключительную ситуацию искусственно, например, по условию
но чтобы при этом в табло не вываливалось "кривых" сообщений в ОписаниеОшибки().
исключительную ситуацию можно вызывать типа x=1/0, но в табло по описанию ошибки выпадет "ненужное" "Деление на 0".

а хочется типа так

Есть конструкция, типа:
Попытка
  //здесь много кода
  Если Условие Тогда
    ВызватьИсключительнуюСитуацию("тутОписаниеОшибкиКотороеВернетсяСистемнойФункциейОписаниеОшибки()");
  КонецЕсли;
  //здесь много кода
Исключение
  Сообщить(ОписаниеОшибки());
КонецПопытки;

..как?
1 Aleksey
 
25.02.20
✎
04:46
goto ?
2 Aleksey
 
25.02.20
✎
04:50
Перейти ~Метка!;  

~ Метка!: Сообщить("Осуществлен переход по метке.");
3 Bigbro
 
25.02.20
✎
04:56
а конец попытки?
или мы так и останемся в попытке и будем накапливать стек погружаясь при повторных вызовах пока не опнемся где нибудь в переполнение?
4 Aleksey
 
25.02.20
✎
05:09
(3) он все равно из процедуры выдкт, тогда и почистит
5 ADirks
 
25.02.20
✎
07:00
(0) если 1С++ подключается, то можно

ВыполняемыйМодуль :: ВыброситьИскл / Throw

Синтаксис: ВыброситьИскл(ОбъектИскл, [ТекстИскл])

Параметры:

ОбъектИскл - тип: Любой. Параметр, который потом можно получить при обработке исключения методом ПолучитьИсключение.
ТекстИскл - тип: Строка. Сообщение об ошибке. По умолчанию "".
Описание: Формирует исключение с объектом, который можно получить при перехвате/обработке исключения с помощью метода ПолучитьИсключение.

При обработке исключения текст сообщения об ошибке можно получить с помощью глобальной функции ОписаниеОшибки(). Если исключение не обработано, этот текст будет выведен в окно сообщений.
6 ololoraise
 
25.02.20
✎
07:24
Можно закрыть 1с не штатном, только как уже не помню, господин Ёпрст знает)
7 Злопчинский
 
25.02.20
✎
12:32
(5) вот это слово "ВыполняемыйМодуль ::" для меня пока загадка.
по описанию то что надо, но как это запилить в код?
8 pechkin
 
25.02.20
✎
12:39
(0) делай
сообщить(ТекстОшибки);
x=1/0;
9 ADirks
 
25.02.20
✎
12:46
(7) типа того:

    ВМ = СоздатьОбъект("ВыполняемыйМодуль");
    ВМ.ВыброситьИскл(, "дадададад");
10 pechkin
 
25.02.20
✎
12:47
(7) для начала нужно 1с++ подключить
11 fisher
 
25.02.20
✎
12:48
ВызватьИсключение не предлагать?
12 fisher
 
25.02.20
✎
12:49
А, черт! В 7.7 оно не умеет другую ошибку возвращать...
13 dk
 
25.02.20
✎
13:27
тоже недавно искал

//*******************************************
Процедура Сформировать()

    Модуль=СоздатьОбъект("ВыполняемыйМодуль");
    
    Попытка
        Сообщить("Все хорошо1 ");
        Модуль.СформироватьОшибку("СлучилосьСтрашное");
        Сообщить("Все хорошо2 ");
    Исключение
        Сообщить("Плохо = " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Процедура Сформировать2()

    Модуль=СоздатьОбъект("ВыполняемыйМодуль");
    
    Попытка
        Сообщить("Все хорошо1 ");
        Модуль.ВыброситьИскл(Константа.БазоваяВалюта, "Вот тут какое то сообщение");
        Сообщить("Все хорошо2 ");
    Исключение
        Сообщить("Плохо = " + ОписаниеОшибки());
        Сообщить("Плохо2 = " + Модуль.ПолучитьИсключение());
    КонецПопытки;
    
КонецПроцедуры
14 8 bit
 
25.02.20
✎
13:48
(0) а почему именно "исключение" требуется?
Что мешает выводить предупреждение(текстпредупреждения, тамаут)?

Ну возникла у тебя какая-то ситуация, выведи табло, пусть втыкают. А для тех, кто любит запустить формирование длительного отчета и свалить с рабочего места, установи таймаут. Параллельно никто не запрещает в журнал регистрации добавлять произвольные записи, а не "банальное деление на 0".
15 8 bit
 
25.02.20
✎
13:51
+(14) еще в объект текст можно было помещать важные уведомления. Висит окошко, наполняется текстом, читай сколько угодно. Непрочитанный текст можно было выводить при старте системы, пусть пользователь почитает, да повнимательнее.
16 Simod
 
25.02.20
✎
14:16
ТекстОшибки = "";

Попытка
    ...
    Если <Условие> Тогда
        ТекстОшибки = "Мое сообщение";
        Результат = 1 / 0;
    КонецЕсли;
    ...

Исключение
    Если ТекстОшибки <> "" Тогда
        Сообщить(ТекстОшибки);
    Иначе
        Сообщить(ОписаниеОшибки());
    КонецЕсли;

КонецПопытки;
17 Злопчинский
 
25.02.20
✎
17:18
(9) понял, спсб
18 Злопчинский
 
25.02.20
✎
17:18
(11) вызвать исключение работает внутри ветки исключение для передачи управления на более внешний обработчик.
19 Ёпрст
 
гуру
25.02.20
✎
17:28
(0)
0/0
20 Djelf
 
25.02.20
✎
18:40
(19) Не... это то же самое что и 1/0, предлагаю (по приколу /* никогда так не делайте*/, еще более угрожающее сообщение)

Сообщить("В обработке произошла полная  "-" >>>   (_!_)  <<<, сколько нужно вычесть у программиста пока не знаем, из-за этого ему выдаем ошибку:");
21 Злопчинский
 
25.02.20
✎
23:46
(20) погромист - хитрый, он поделит на 0 так, что никакого исключения не будет:
ПолнаяХерня = ПолнаяХерня/0; - исключения не будет...