Ada_Ru форум

Обсуждение языка Ада

Ada05 exceptons

Оставить новое сообщение

Сообщения

Vladyslav Kozlovskyy
Ada05 exceptons
2006-04-06 08:45:05

îÁÒÏÄ, ÅÓÔØ ÌÉ × áÄÅ ×ÏÚÍÏÖÎÏÓÔØ

Õ×ÉÄÉÔØ ÃÅÐÏÞËÕ ÉÓËÌÀÞÅÎÉÊ, Á ÎÅ ÔÏÌØËÏ ÏÄÎÏ?

 

èÏÔÅÌÏÓØ ÂÙ Õ×ÉÄÉÔØ × ÄÁÎÏÊ ÓÉÔÕÁÃÉÉ:

MYEXCEPTION3 : Hello3

MYEXCEPTION2 : Hello2

MYEXCEPTION1 : Hello1

 

 

á ÐÏËÁÚÙ×ÁÅÔÓÑ ÔÏÌØËÏ:

Raised MYEXCEPTION1 : Hello1

 

÷ÌÁÄ

 

ÓÏÂÓÔ×ÅÎÎÏ ÔÅÓÔÏ×ÁÑ ÐÒÏÃÅÄÕÒËÁ:

--------------------------------------------------------

procedure p is

 

MyException1, MyException2, MyException3 : exception;

 

begin

 

begin

 

begin

 

raise MyException3 with "Hello3";

 

exception when others =>

 

raise MyException2 with "Hello2";

 

end;

 

exception when E: others =>

 

raise MyException1 with "Hello1";

 

end;

 

end p;

 

--------------------------------------------------------

îÁÒÏÄ, ÅÓÔØ ÌÉ × áÄÅ ×ÏÚÍÏÖÎÏÓÔØ

Õ×ÉÄÉÔØ ÃÅÐÏÞËÕ ÉÓËÌÀÞÅÎÉÊ, Á ÎÅ ÔÏÌØËÏ ÏÄÎÏ?

 

ôÏ ËÁË ×Ù ÎÁÐÉÓÁÌÉ - ÅÓÔÅÓÔ×ÅÎÎÏ ÎÅÔ. ÷Ù Ö ×ÓÅ ÐÒÅÄÙÄÕÝÉÅ ÉÓËÌÀÞÅÎÉÑ ÏÂÒÁÂÏÔÁÌÉ! åÓÌÉ ÈÏÔÉÔÅ ÃÅÐÏÞËÕ - ÐÉÛÉÔÅ ÔÁË:

 

 

with Ada.Exceptions; use Ada.Exceptions;

 

procedure p is

 

MyException1, MyException2, MyException3 : exception;

 

begin

 

begin

 

begin

 

raise MyException3 with "Hello3";

 

exception when E : others =>

 

raise MyException2 with "Hello2" & ASCII.LF &

Exception_Name (E) & " : " & Exception_Message (E);

 

end;

 

exception when E: others =>

 

raise MyException1 with "Hello1" & ASCII.LF &

Exception_Name (E) & " : " & Exception_Message (E);

 

end;

 

end p;

 

־.

Vasiliy Fofanov wrote:

îÁÒÏÄ, ÅÓÔØ ÌÉ × áÄÅ ×ÏÚÍÏÖÎÏÓÔØ

Õ×ÉÄÉÔØ ÃÅÐÏÞËÕ ÉÓËÌÀÞÅÎÉÊ, Á ÎÅ ÔÏÌØËÏ ÏÄÎÏ?

ôÏ ËÁË ×Ù ÎÁÐÉÓÁÌÉ - ÅÓÔÅÓÔ×ÅÎÎÏ ÎÅÔ. ÷Ù Ö ×ÓÅ ÐÒÅÄÙÄÕÝÉÅ ÉÓËÌÀÞÅÎÉÑ

ÏÂÒÁÂÏÔÁÌÉ! åÓÌÉ ÈÏÔÉÔÅ ÃÅÐÏÞËÕ - ÐÉÛÉÔÅ ÔÁË:

 

 

with Ada.Exceptions; use Ada.Exceptions;

 

procedure p is

 

MyException1, MyException2, MyException3 : exception;

 

begin

 

begin

 

begin

 

raise MyException3 with "Hello3";

 

exception when E : others =>

 

raise MyException2 with "Hello2" & ASCII.LF &

Exception_Name (E) & " : " & Exception_Message (E);

 

end;

 

exception when E: others =>

 

raise MyException1 with "Hello1" & ASCII.LF &

Exception_Name (E) & " : " & Exception_Message (E);

 

end;

 

end p;

 

־.

 

ñ ÔÁË É ÐÒÅÄÐÏÌÁÇÁÌ. :)

 

îÏ, ×ÙÞÉÔÁÌ (ËÁÖÉÓØ × ARM), ÞÔÏ Exception_message ÎÅ ÄÏÌÖïÎ ÐÒÅ×ÙÛÁÔØ 200 ÓÉÍ×ÏÌÏ×.

(ÔÁÍ ÔÉÐÁ ÞÔÏ-ÔÏ ÎÅ ÇÁÒÁÎÔÉÒÕÀÔ. ðÏÌÕÞÁÅÔÓÑ, ÞÔÏ ÅÓÌÉ ÄÅÌÁÔØ ÔÁË, ÔÏ ÔÅËÓÔ ÂÕÄÅÔ ÏÂÒÅÚÁÔÓÑ. á ËÁË × GNATe? ëÁËÏ× ÔÁÍ ÍÁËÓÉÍÁÌØÎÏ ÄÏÐÕÓÔÉÍÙÊ ÒÁÚÍÅÒ Exception_message?

 

 

ñ ÔÕÔ ÔÉÐÁ ÔÁËÏÅ ÎÁÐÉÓÁÌ:

procedure p is

MyException1, MyException2, MyException3 : exception;

 

use ada.exceptions;

procedure ChainReraise( old_exception : in Exception_Occurrence;

new_exception : in Exception_Id;

new_exception_message : in String ) is

begin

Raise_Exception( new_exception,

new_exception_message &

ASCII.LF &

Exception_Name(old_exception) &

" : " &

Exception_Message(old_exception)

);

end ChainReraise;

 

begin

begin

begin

raise MyException3 with "Hello3";

exception

when E: others =>

ChainReraise(E, MyException2'Identity, "Hello2");

end;

exception

when E: others =>

ChainReraise(E, MyException1'Identity, "Hello1");

end;

end p;

á ËÁË × GNATe? ëÁËÏ× ÔÁÍ ÍÁËÓÉÍÁÌØÎÏ ÄÏÐÕÓÔÉÍÙÊ

ÒÁÚÍÅÒ Exception_message?

 

îÅ ÐÏÍÎÀ ÞÅÓÔÎÏ ÇÏ×ÏÒÑ. úÁ×ÅÄÏÍÏ ÂÏÌØÛÅ ÞÅÍ 200, ÎÏ ËÏÎÅÞÎÏ ÓÏ×ÓÅÍ ÎÅ ÂÅÓËÏÎÅÞÎÙÊ, ÚÌÏÕÐÏÔÒÅÂÌÑÔØ ÜÔÉÍ ÎÅ ÓÔÏÉÔ.

 

÷ ÌÀÂÏÍ ÓÌÕÞÁÅ ÍÎÅ ËÁÖÅÔÓÑ ×ÁÛ ÐÏÄÈÏÄ ÓÕÇÕÂÏ ÐÏÒÏÞÅÎ. åÓÌÉ ÎÅ ÈÏÔÉÔÅ ÏÂÒÁÂÁÔÙ×ÁÔØ ÉÓËÌÀÞÅÎÉÅ × ÜÔÏÍ ËÏÎÔÅËÓÔÅ - ÔÁË ÚÁÞÅÍ ÅÇÏ ÌÏ×ÉÔØ? ôÏÌØËÏ ÚÁÍÅÄÌÑÅÔÅ ÌÉÂÏ ×ÓÀ ÐÒÏÇÒÁÍÍÕ (ÅÓÌÉ ÍÅÈÁÎÉÚÍ sjlj) ÌÉÂÏ ÏÂÒÁÂÏÔËÕ ÉÓËÌÀÞÅÎÉÑ (ÅÓÌÉ ÍÅÈÁÎÉÚÍ zcx).

 

־

Vasiliy Fofanov wrote:

á ËÁË × GNATe? ëÁËÏ× ÔÁÍ ÍÁËÓÉÍÁÌØÎÏ ÄÏÐÕÓÔÉÍÙÊ

ÒÁÚÍÅÒ Exception_message?

îÅ ÐÏÍÎÀ ÞÅÓÔÎÏ ÇÏ×ÏÒÑ. úÁ×ÅÄÏÍÏ ÂÏÌØÛÅ ÞÅÍ 200, ÎÏ ËÏÎÅÞÎÏ ÓÏ×ÓÅÍ ÎÅ

ÂÅÓËÏÎÅÞÎÙÊ, ÚÌÏÕÐÏÔÒÅÂÌÑÔØ ÜÔÉÍ ÎÅ ÓÔÏÉÔ.

 

÷ ÌÀÂÏÍ ÓÌÕÞÁÅ ÍÎÅ ËÁÖÅÔÓÑ ×ÁÛ ÐÏÄÈÏÄ ÓÕÇÕÂÏ ÐÏÒÏÞÅÎ. åÓÌÉ ÎÅ ÈÏÔÉÔÅ

ÏÂÒÁÂÁÔÙ×ÁÔØ ÉÓËÌÀÞÅÎÉÅ × ÜÔÏÍ ËÏÎÔÅËÓÔÅ - ÔÁË ÚÁÞÅÍ ÅÇÏ ÌÏ×ÉÔØ? ôÏÌØËÏ

ÚÁÍÅÄÌÑÅÔÅ ÌÉÂÏ ×ÓÀ ÐÒÏÇÒÁÍÍÕ (ÅÓÌÉ ÍÅÈÁÎÉÚÍ sjlj) ÌÉÂÏ ÏÂÒÁÂÏÔËÕ

ÉÓËÌÀÞÅÎÉÑ (ÅÓÌÉ ÍÅÈÁÎÉÚÍ zcx).

 

־

 

ïË. ÷ ÄÅÊÓÔ×ÉÔÅÌØÎÏÓÉ ÍÅÎÑ ÉÎÔÅÒÅÓÕÅÔ ÐÁÔÔÅÒÎ ÏÂÒÁÂÏÔËÉ ÏÛÉÂÏË.

ëÁËÉÅ ÐÁÔÔÅÒÎÙ ÏÂÒÁÂÏÔËÉ ÏÛÉÂÏË ÉÓÐÏÌØÚÕÀÔÓÑ × áÄÅ?

 

ñ ×ÉÖÕ ÔÁËÉÅ:

1. éÓËÌÀÞÅÎÉÅ, ×ÏÚÎÉËÛÅÅ × ÒÅÚÕÌØÔÁÔÅ ÏÛÉÂËÉ ÐÅÒÅÄÁÅÔÓÑ "ÎÁ×ÅÒÈ" É ÐÏËÁÚÙ×ÁÅÔÓÑ ÐÏÌØÚÏ×ÁÔÅÌÀ "ËÁË ÅÓÔØ"

ðÒÅÉÍÕÝÅÓÔ×Ï: ðÒÏÓÔÏ. éÓÐÏÌØÚÕÅÔÓÑ ÍÅÈÁÎÉÚÍ ÉÓËÌÀÞÅÎÉÊ áÄÙ. ìÏÇÉËÁ ÐÒÏÇÒÁÍÍÙ ÎÅ ÚÁÈÌÁÍÌÅÎÁ

ÏÂÒÁÂÏÔÞÉËÁÍÉ É ÐÅÒÅÈ×ÁÔÞÉËÁÍÉ.

îÅÄÏÓÔÁÔËÉ:

- ÞÁÓÔÏ ÔÁËÏÅ ÓÏÏÂÝÅÎÉÅ ÂÕÄÅÔ "ÎÉ Ë ÓÅÌÕ ÎÉ Ë ÇÏÒÏÄÕ":

ÎÁ ÄÅÊÓÔ×ÉÅ ÐÏÌØÚÏ×ÁÔÅÌÑ: <Add User> ÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÓÏÏÂÝÅÎÉÅ "FILE_OPEN_ERROR : file <users.dat> not found" :)

- ÐÅÒÅÈ×ÁÔÉÔØ ÔÁËÏÅ ÓÏÏÂÝÅÎÉÅ ÎÁ ×ÅÒÈÎÉÈ ÕÒÏ×ÎÑÈ ÍÏÖÎÏ ÔÏÌØËÏ ÌÉÂÏ ÔÏÞÎÏ ÚÎÁÑ ÓÔÒÕËÔÕÒÕ ÐÒÏÇÒÁÍÍÙ

(É ÉÓËÌÀÞÅÎÉÑ, ËÏÔÏÒÙÅ ËÏÇÄÁ-ÌÉÂÏ ÍÏÇÕÔ ÂÙÔØ ×ÏÚÎÉËÎÕÔØ), ÌÉÂÏ ÐÏÌØÚÕÑÓØ ËÌÁÓÓÉÆÉËÁÔÏÒÏÍ "others" (ËÓÔÁÔÉ, ËÏÇÄÁ ÉÓËÌÀÞÅÎÉÅ ×ÙÈÏÄÉÔ ÉÚ ÏÂÌÁÓÔÉ ×ÉÄÉÍÏÓÔÉ, ÔÏ ÅÇÏ ÔÏÌØËÏ others É ÍÏÖÅÔ ÐÅÒÅÈ×ÁÔÉÔØ, ÔÁË?).

2. ëÁÖÄÙÊ ÐÁËÅÔ/ÐÒÏÃÅÄÕÒÁ ÏÐÒÅÄÅÌÑÅÔ ÎÁÂÏÒ ÉÓËÌÀÞÅÎÉÊ, ËÏÔÏÒÙÊ ÍÏÖÅÔ ×ÏÚÂÕÖÄÁÔØ. ïÓÔÁÌØÎÙÅ "×ÎÕÔÒÅÎÎÉÅ" ÉÓËÌÀÞÅÎÉÑ ÐÅÒÅÈ×ÁÔÙ×ÁÀÔÓÑ É "ÏÂÅÒÔÙ×ÁÀÔÓÑ" × ÏÄÎÏ ÉÚ ÏÂØÑ×ÌÅÎÎÙÈ ÉÓËÌÀÞÅÎÉÊ. ðÏÄÏÂÎÙÊ ÐÏÄÈÏÄ ÐÒÁËÔÉËÕÅÔÓÑ × Java. íÎÅ ËÁÖÅÔÓÑ ÎÁÉÂÏÌÅÅ ÌÏÇÉÞÎÙÍ (×ÏÔ ÐÏÞÅÍÕ Ñ ÓÐÒÁÛÉ×ÁÌ ÉÍÅÎÎÏ Ï ÎÅÍ).

ðÒÅÉÍÕÝÅÓÔ×Ï:

- óÏÏÂÝÅÎÉÅ Ï ÏÛÉÂËÅ ÉÎÆÏÒÍÁÔÉ×ÎÙÊ É ÐÏÎÑÔÎÙÊ É ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ É (×ÌÏÖÅÎÎÙÅ ÉÓËÌÀÞÅÎÉÑ) ÄÌÑ ÏÂÓÌÕÖÉ×ÁÀÝÅÇÏ ÐÅÒÓÏÎÁÌÁ:

ÎÁ ÄÅÊÓÔ×ÉÅ ÐÏÌØÚÏ×ÁÔÅÌÑ <Add User> ÍÏÖÎÏ ÐÏÌÕÞÉÔØ ÓÏÏÂÝÅÎÉÅ:

ADD_USER_ERROR : Error during adding new user

CHECK_USERS_RIGHTS_ERROR : User <jack> has no rights to add new user

FILE_OPEN_ERROR: file <users.dat> not found

- ðÒÏÇÒÁÍÍÉÓÔ ÎÁÐÅÒÅÄ ÚÎÁÅÔ ÓÐÉÓÏË ÉÓËÌÀÞÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ×ÏÚÎÉËÎÕÔØ É ÓÍÏÖÅÔ ÐÒÁ×ÉÌØÎÏ ÎÁ ÎÉÈ ÓÒÅÁÇÉÒÏ×ÁÔØ

 

îÅÄÏÓÔÁÔËÉ:

- ÷ÁÓÉÌÉÊ ÏÐÉÓÁÌ - ÓÁÍÅÄÌÅÎÉÅ ÂÙÓÔÒÏÄÅÊÓÔ×ÉÑ (Ñ, ÐÒÁ×ÄÁ ÐÏËÁ ÐÌÏÈÏ ÚÎÁËÏÍ Ó Linux i Gnat RunTime, ÐÏÜÔÏÍÕ sjlj É szx ÄÌÑ ÍÅÎÑ ×ÓÅÇÏ ÌÉÛØ ÕÍÎÙÅ ÁÂÒÅ×ÉÁÔÕÒÙ :)

- ìÏÇÉËÁ ÐÒÏÇÒÁÍÍÙ ÚÁÈÌÁÍÌÉ×ÁÅÔÓÑ reraise ÐÒÏÃÅÄÕÒÁÍÉ

- þÁÓÔÏ ÎÅÐÏÎÑÔÎÏ ÇÄÅ É ËÁËÏÅ ÉÓËÌÀÞÅÎÉÅ (É Ó ËÁËÉÍ ÔÅËÓÔÏÍ) ÇÅÎÅÒÉÒÏ×ÁÔØ

 

3. éÓÐÏÌØÚÏ×ÁÔØ ÉÓËÌÀÞÅÎÉÅ ÉÓËÌÀÞÉÔÅÌØÎÏ ÄÌÑ Á×ÁÒÉÊÎÙÈ ÓÉÔÕÁÃÉÊ. óÏÏÂÝÅÎÉÑ Ï ÏÛÉÂËÅ (×ÅÒÎÅÅ - ÓÔÁÔÕÓ) É ÔÅËÓÔ, ÅÅ ÓÏÐÒÏ×ÏÖÄÁÀÝÉÊ ÐÅÒÅÄÁ×ÁÔØ ÓÔÒÕËÔÕÒÏÊ (id, msg) ÞÅÒÅÚ access ÐÁÒÁÍÅÔÒ ÌÉÂÏ ÚÎÁÞÅÎÉÅ ×ÏÚ×ÒÁÝÁÅÍÏÅ ÉÚ ÆÕËÃÉÉ.

ôÉÐÁ ×ÓÅ ÐÒÏÃÅÄÕÒÙ ÐÒÅ×ÒÁÝÁÀÔÓÑ × ÆÕÎËÃÉÉ:

function AnyFunction ( ... ) return Status_Type;

procedure AnyProcedure(..., status : access Status_Type );

 

ÐÒÏ×ÅÒËÁ:

if AnyFunction(...).id = Status_Ok then ...

 

AnyProcedure(..., status'access );

if status.id = Status_Ok then ...

 

ðÒÅÉÍÕÝÅÓÔ×Á:

- ÞÅÔËÏÅ ÒÁÚÄÅÌÅÎÉÅ ÉÎÆÏÒÍÁÃÉÏÎÎÙÈ ÐÏÔÏËÏ× ÏÔ Á×ÁÒÉÊÎÙÈ

- ÍÅÈÁÎÉÚÍ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÓË×ÏÚØ ÃÅÐÏÞËÕ ×ÙÚÏ×Ï× DLL, ÎÁÐÉÓÁÎÎÙÍÉ ÎÁ C/C++/áÄÁ (ÐÒÏ×ÅÒÅÎÏ)

(ÅÓÌÉ ×ÏÏÂÝÅ ÎÅ ÇÅÎÅÒÉÒÏ×ÁÔØ ÉÓËÌÀÞÅÎÉÑ)

 

îÅÄÏÓÔÁÔËÉ:

- ïþåîø ÓÉÌØÎÏ ÚÁÈÌÁÍÌÑÅÔÓÑ ÌÏÇÉËÁ ÐÒÏÇÒÁÍÍÙ

if fun1(..).id = Status_Ok then

if fun2(...).id = Status_Ok then

if fun3(...).id = Status_Ok then

...

Á ÍÏÖÎÏ ÂÙÌÏ ÎÁÐÉÓÁÔØ ÐÒÏÓÔÏ:

fun1(...);

fun2(...);

fun3(...);

- ÐÏÓÔÏÑÎÎÏ ÎÕÖÎÏ ÐÅÒÅÄÁ×ÁÔØ ÌÉÛÎÉÊ ÐÁÒÁÍÅÔÒ, ÌÉÂÏ ×ÓÅ ÐÒÏÃÅÄÕÙ ÏÂØÑ×ÌÑÔØ ÆÕÎËÃÉÑÍÉ

 

4. íÅÈÁÎÉÚÍ ×ÎÅÛÎÅÇÏ ÏÂØÅËÔÁ-ÒÅÇÉÓÔÒÁÔÏÒÁ ÏÛÉÂÏË (ÏÔÄÅÌØÎÙÊ É ÇÌÏÂÁÌØÎÙÊ ÄÌÑ ËÁÖÄÏÇÏ ÐÏÔÏËÁ). ëÏÄ ÏÛÉÂËÉ É ÔÅËÓÔ ÏÛÉÂËÉ ÒÅÇÉÓÔÒÉÒÕÅÔÓÑ × ÄÁÎÎÏÍ ÏÂØÅËÔÅ (ÐÒÉÍÅÒ, ÆÕÎËÃÉÉ SetLastError(), GetLastError() Ó Win32Api). îÏ ÄÁÎÎÙÊ ÍÅÈÁÎÉÚÍ ÐÅÒÅËÌÉËÁÅÔÓÑ Ó ÓÐÏÓÏÂÏÍ 2.

 

5. ... ÷áû úîáþéôåìøîï ìõþûéê ïô ðòåäìïöåîîùè ÷ùûå óðïóïâ ...

÷ÌÁÄÉÓÌÁ×,

 

ôÒÕÄÎÏ ÕËÁÚÁÔØ ÎÁ ÌÀÂÏÊ ÉÚ ÐÒÅÄÌÏÖÅÎÎÙÈ ×ÁÍÉ ÐÕÎËÔÏ× É ÓËÁÚÁÔØ - ÄÁ, ÏÛÉÂËÉ ÎÁÄÏ ÏÂÒÁÂÁÔÙ×ÁÔØ ÔÏÌØËÏ ÔÁË É ÎÉËÁË ÉÎÁÞÅ. ÷ ÒÁÚÎÙÈ ÓÌÕÞÁÑÈ

ÐÒÅÄÐÏÞÔÉÔÅÌØÎÅÅ ÒÁÚÎÙÅ ÍÅÈÁÎÉÚÍÙ. åÄÉÎÓÔ×ÅÎÎÏÅ ÏÂÝÅÅ ÓÏÏÂÒÁÖÅÎÉÅ, ËÏÔÏÒÙÍ ÍÙ ÐÙÔÁÅÍÓÑ ÓÁÍÉ ÒÕËÏ×ÏÄÓÔ×Ï×ÁÔØÓÑ, ÜÔÏ ÞÔÏ ×ÏÏÂÛÅ ÇÏ×ÏÒÑ ÉÓËÌÀÞÅÎÉÑ ÎÅ ÓÔÏÉÔ ÉÓÐÏÌØÚÏ×ÁÔØ ËÁË ad-hoc ÍÅÈÁÎÉÚÍ ÐÅÒÅÄÁÞÉ ÉÎÆÏÒÍÁÃÉÉ ÉÚ ÐÏÄÓÉÓÔÅÍÙ × ÐÏÄÓÉÓÔÅÍÕ. ÷ ×ÁÛÅÍ ÐÒÉÍÅÒÅ × ÞÁÓÔÎÏÓÔÉ, ÏÔÓÕÔÓÔ×ÉÅ ÎÕÖÎÏÇÏ ÆÁÊÌÁ ÓÌÅÄÕÅÔ ÐÒÏ×ÅÒÑÔØ, Á ÎÅ ÐÏÌÁÇÁÔØÓÑ ÎÁ ÉÓËÌÀÞÅÎÉÅ ×ÙÚ×ÁÎÎÏÅ ÐÏÐÙÔËÏÊ ÏÔËÒÙÔÉÑ ÎÅÓÕÝÅÓÔ×ÕÀÝÅÇÏ ÆÁÊÌÁ.

 

éÎÙÍÉ ÓÌÏ×ÁÍÉ, "ÉÓËÌÀÞÅÎÉÑ" - ÄÌÑ "éóëìàþéôåìøîùè ÓÉÔÕÁÃÉÊ". åÓÌÉ ×ÏÚÍÏÖÎÏÓÔØ ÏÔÓÕÔÓÔ×ÉÑ ÆÁÊÌÁ ÌÏÇÉËÏÊ ÐÒÏÇÒÁÍÍÙ ÄÏÐÕÓËÁÅÔÓÑ, ÔÏ ÜÔÏ ÓÉÔÕÁÃÉÑ ÎÅ ÉÓËÌÀÞÉÔÅÌØÎÁÑ É ÄÏÌÖÎÁ ÏÂÒÁÂÁÔÙ×ÁÔØÓÑ ÛÔÁÔÎÙÍ ËÏÄÏÍ.

 

åÝÅ ÏÄÉÎ ÓÏ×ÅÔ, ×ÍÅÓÔÏ ÃÅÐÏÞËÉ reraise ÉÍÅÊÔÅ ÔÁËÖÅ × ×ÉÄÕ, ÞÔÏ ×Ù ÍÏÖÅÔÅ ÐÒÉËÒÅÐÉÔØ Ë ÉÓËÌÀÞÅÎÉÀ ÓÔÅË ×ÙÚÏ×Á É ÓÐÏËÏÊÎÏ ÎÁ ÎÅÇÏ ÐÏÇÌÑÄÅÔØ ËÏÇÄÁ ÐÒÏÇÒÁÍÍÁ ÏÂÒÕÛÉÔÓÑ ÐÒÉ ÐÏÍÏÝÉ addr2line.

 

־

On Fri, Apr 07, 2006 at 12:25:20PM +0300, Vladyslav Kozlovskyy wrote:

Vasiliy Fofanov wrote:

А как в GNATe? Каков там максимально допустимый

размер Exception_message?

 

 

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

 

Точно!

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

исключений собрать в список и список положить в глобальную переменную, если однозадачная реализация или в атрибут задачи (Ada.Task_Attributes), если нет. Тогда нет нужды использовать строки, можно хранить даже сами Exception_Occurence, там есть стеки вызовов

 

Ок. В действительноси меня интересует паттерн обработки ошибок.

Какие паттерны обработки ошибок используются в Аде?

 

 

Попробуй почитать кусочек из Ada Quality & Style

4.3 EXCEPTIONS

 

http://www.iste.uni-stuttgart.de/ps/ada-doc/style_guide/sec_4.html#4.3

На днях выложим перевод первых нескольких глав.

--

Maxim Reznik

óÐÁÓÉÂÏ ÷ÁÓÉÌÉÊ, ÏÂÝÅÅ ÎÁÐÒÁ×ÌÅÎÉÅ Ñ ÐÏÎÑÌ. äÁÌØÛÅ ÂÕÄÕ ÓÁÍ ËÏÐÁÔØ

 

 

Vasiliy Fofanov wrote:

åÝÅ ÏÄÉÎ ÓÏ×ÅÔ, ×ÍÅÓÔÏ ÃÅÐÏÞËÉ reraise ÉÍÅÊÔÅ ÔÁËÖÅ × ×ÉÄÕ, ÞÔÏ ×Ù ÍÏÖÅÔÅ

ÐÒÉËÒÅÐÉÔØ Ë ÉÓËÌÀÞÅÎÉÀ ÓÔÅË ×ÙÚÏ×Á É ÓÐÏËÏÊÎÏ ÎÁ ÎÅÇÏ ÐÏÇÌÑÄÅÔØ ËÏÇÄÁ

ÐÒÏÇÒÁÍÍÁ ÏÂÒÕÛÉÔÓÑ ÐÒÉ ÐÏÍÏÝÉ addr2line.

 

á ÜÔÏ ËÁË ÄÅÌÁÅÔÓÑ? èÏÔÅÌÏÓØ ÂÙ ÐÏÞÉÔÁÔØ Ï ÜÔÏÍ ÐÏÄÒÏÂÎÅÅ.

 

÷ÌÁÄ

Maxim Reznik wrote:

Не нужно использовать сообщение в исключении для передачи чего-то кроме

описания этого сообщения. Если надо передать другую информацию, лучше

сохранить ее в соответствующих структурах. Например, эту цепочку

исключений собрать в список и список положить в глобальную переменную,

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

Exception_Occurence, там есть стеки вызовов

 

А где там стеки вызовов? Как ими пользоватся?

Ок. В действительноси меня интересует паттерн обработки ошибок.

Какие паттерны обработки ошибок используются в Аде?

 

Попробуй почитать кусочек из Ada Quality & Style

4.3 EXCEPTIONS

 

Спасибо за совет

http://www.iste.uni-stuttgart.de/ps/ada-doc/style_guide/sec_4.html#4.3

 

На днях выложим перевод первых нескольких глав. Нужная штука. Буду ждать.

 

 

Влад

á ÜÔÏ ËÁË ÄÅÌÁÅÔÓÑ? èÏÔÅÌÏÓØ ÂÙ ÐÏÞÉÔÁÔØ Ï ÜÔÏÍ ÐÏÄÒÏÂÎÅÅ.

 

ðÒÏÓÔÏ ÄÏÂÁ×ÌÑÅÔÅ ÐÁÒÁÍÅÔÒ -E ÄÌÑ gnatbind (-bargs -E). ôÏÇÄÁ ÐÒÏÇÒÁÍÍÁ ÂÕÄÅÔ ÚÁÐÉÓÙ×ÁÔØ ÓÔÅË ÔÏÞËÉ ×ÏÚÎÉËÎÏ×ÅÎÉÑ ÉÓËÌÀÞÅÎÉÑ. óÍ. GNAT UG 4.2

îÁÐÒÉÍÅÒ, ÂÅÚ -å ÐÒÏÇÒÁÍÍÁ ×ÙÄÁÅÔ ÞÔÏ-ÎÉÂÕÄØ ×ÒÏÄÅ

 

raised CONSTRAINT_ERROR : f.adb:3 explicit raise

 

Á ÐÒÉ ÎÁÌÉÞÉÉ -å,

 

Execution terminated by unhandled exception

Exception name: CONSTRAINT_ERROR

Message: f.adb:3 explicit raise

Call stack traceback locations:

0x4013d3 0x4013ab 0x4011d6 0x401201 0x7c816d4d

 

ðÏÔÏÍ ÐÒÏÓÔÏ ×ËÌÅÉ×ÁÅÔÅ ÎÉÖÎÀÀ ÓÔÒÏÞËÕ × ËÏÍÁÎÄÎÕÀ ÓÔÒÏËÕ addr2line ÞÔÏÂÙ ÐÏÌÕÞÉÔØ ÓÉÍ×ÏÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ, ÎÁÐÒ.:

 

$ addr2line -e f 0x4013d3 0x4013ab 0x4011d6 0x401201 0x7c816d4d -f 04013D3 in f at f.adb:3

04013AB in main at b~f.adb:106

04011D6 in ?? at crtst.c:0

0401201 in ?? at crtst.c:0

C816D4D in ?? at ??:0

 

־

Vasiliy Fofanov wrote:

á ÜÔÏ ËÁË ÄÅÌÁÅÔÓÑ? èÏÔÅÌÏÓØ ÂÙ ÐÏÞÉÔÁÔØ Ï ÜÔÏÍ ÐÏÄÒÏÂÎÅÅ.

ðÒÏÓÔÏ ÄÏÂÁ×ÌÑÅÔÅ ÐÁÒÁÍÅÔÒ -E ÄÌÑ gnatbind (-bargs -E). ôÏÇÄÁ ÐÒÏÇÒÁÍÍÁ

ÂÕÄÅÔ ÚÁÐÉÓÙ×ÁÔØ ÓÔÅË ÔÏÞËÉ ×ÏÚÎÉËÎÏ×ÅÎÉÑ ÉÓËÌÀÞÅÎÉÑ. óÍ. GNAT UG 4.2

 

îÁÐÒÉÍÅÒ, ÂÅÚ -å ÐÒÏÇÒÁÍÍÁ ×ÙÄÁÅÔ ÞÔÏ-ÎÉÂÕÄØ ×ÒÏÄÅ

 

raised CONSTRAINT_ERROR : f.adb:3 explicit raise

 

Á ÐÒÉ ÎÁÌÉÞÉÉ -å,

 

Execution terminated by unhandled exception

Exception name: CONSTRAINT_ERROR

Message: f.adb:3 explicit raise

Call stack traceback locations:

0x4013d3 0x4013ab 0x4011d6 0x401201 0x7c816d4d

 

ðÏÔÏÍ ÐÒÏÓÔÏ ×ËÌÅÉ×ÁÅÔÅ ÎÉÖÎÀÀ ÓÔÒÏÞËÕ × ËÏÍÁÎÄÎÕÀ ÓÔÒÏËÕ addr2line ÞÔÏÂÙ

ÐÏÌÕÞÉÔØ ÓÉÍ×ÏÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ, ÎÁÐÒ.:

 

$ addr2line -e f 0x4013d3 0x4013ab 0x4011d6 0x401201 0x7c816d4d -f

04013D3 in f at f.adb:3

04013AB in main at b~f.adb:106

04011D6 in ?? at crtst.c:0

0401201 in ?? at crtst.c:0

C816D4D in ?? at ??:0

 

־

 

 

÷ÏÕ! úÄÏÒÏ×Ï!

 

íÁËÓÉÍ, ÍÏÖÅÔ ÜÔÏ ÏÐÉÓÁÎÉÅ ÎÁ Ada-ru ÓÏÈÒÁÎÉÔØ ËÁË FAQ?

Воу! Здорово!

 

а чтою на использовать addr2line в тестовых версиях програмы можно использовать следующее

 

exception

when The_Event: others =>

ADA.Text_IO.Put_Line(Ada.Exceptions.Exception_Name(The_Event)); ADA.Text_IO.Put_Line(Ada.Exceptions.Exception_Information(The_Event));

ADA.Text_IO.Put_Line

(GNAT.Traceback.Symbolic.Symbolic_Traceback(The_Event));

end;

а чтою на использовать addr2line в тестовых версиях програмы можно использовать следующее

 

Совершенно верно.

 

ВФ

а чтою на использовать addr2line в тестовых версиях програмы можно использовать следующее

 

 

К сожалению

GNAT.Traceback.Symbolic.Symbolic_Traceback

часто не работает в "доморощенных" сборках разных дистрибутивов

Linux-а. Это связано с тем, что для ее работы надо библиотека

(libaddr2line), построенная из исходников binutils, предварительно пропатченных GNAT-скими патчами. Не помню уже от чего, но построение этой библиотеки вызывало трудности.

 

--

Maxim Reznik

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти