îÁÒÏÄ, ÅÓÔØ ÌÉ × áÄÅ ×ÏÚÍÏÖÎÏÓÔØ
Õ×ÉÄÉÔØ ÃÅÐÏÞËÕ ÉÓËÌÀÞÅÎÉÊ, Á ÎÅ ÔÏÌØËÏ ÏÄÎÏ?
èÏÔÅÌÏÓØ ÂÙ Õ×ÉÄÉÔØ × ÄÁÎÏÊ ÓÉÔÕÁÃÉÉ:
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
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти