Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
MadDog_
1 / 1 / 0
Регистрация: 04.04.2007
Сообщений: 23
#1

Как генерировать исключения? - C++

05.04.2007, 00:04. Просмотров 1825. Ответов 3
Метки нет (Все метки)

Как сгенерировать исключение.
Как выход индекса за пределы допустимого диапозона.
Изучаю API
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2007, 00:04     Как генерировать исключения?
Посмотрите здесь:

программка должна генерировать безопасный пароль C++
Генерировать последовательности C++
C++ Как генерировать текст по шаблону
C++ Как свиртуализировать исключения?
Как перебросить исключение дальше в обработчике исключения? C++
Как бросать эти исключения? C++
Как генерировать случайные числа? C++
Как передать управление в блок catch после системного исключения (компилятор g++)? C++
C++ Как функцией rand() генерировать упорядоченные тройки различных чисел
C++ Как правильно обрабатывать исключения в приложении на базе графического движка?
Как правильно вызывать исключения? C++
Как создавать информативные исключения? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alucard
1 / 1 / 1
Регистрация: 18.04.2007
Сообщений: 41
19.04.2007, 08:42     Как генерировать исключения? #2
По подробнее можна?
Александр Ключников
0 / 0 / 0
Регистрация: 18.04.2007
Сообщений: 64
08.05.2007, 12:18     Как генерировать исключения? #3
Цитата Сообщение от MadDog_ Посмотреть сообщение
Как сгенерировать исключение.
Как выход индекса за пределы допустимого диапозона.
Изучаю API
1. Ну, вот тебе простенький пример кода, использующего исключения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#include "TestExtStPr.h"
 
#define XP_NOERROR      0
#define XP_ERROR        1
 
#define MAX_SERVER_ERROR 20000
#define XP_HELLO_ERROR MAX_SERVER_ERROR+1
 
 
 
 
 
/*--------------------------------------------------------------------------xp_TestProc
Exported function - extended stored procedure for SQL server.
 
Parameters:
#1 (int)
#2 (varchar) - token for to bind to existing connection
*/
 
SRVRETCODE xp_TestProc(SRV_PROC *pSrvProc)
{
/* Hangs!
    MessageBox(NULL,"Extended Stored Procedure \n \"xp_TestProc\" \n is called.",
        "Test Extended Stored Procedure",MB_OK);
*/
 
SRVRETCODE RetCode = XP_NOERROR;
char sMsg[1024];
int iCol;           
int iParamNumber;
 
try {
 
    MessageBeep(MB_ICONASTERISK);
    SendMsg(pSrvProc, "xp_TestProc: Started.");
 
  //Use srv_rpcparams to check number of parameters.
    //NB! Parameters must be passed by position, not by names!
    if(srv_rpcparams(pSrvProc) != 2) throw XP_ERRORPARAMQUANTITY;
        
    // Check data types. Throw error if wrong type.
  CheckParamType(pSrvProc,iParamNumber=1,SRVINTN);  
    CheckParamType(pSrvProc,iParamNumber=2,SRVBIGVARCHAR);
 
    LPVOID pArg1 = srv_paramdata(pSrvProc, 1);
    int iArg1 = 0;
    if(pArg1) iArg1 = *((LPINT)(pArg1));
  SendMsg(pSrvProc, "xp_TestProc: 1st argument is %d", iArg1);
 
    char * sToken = PCHAR(srv_paramdata(pSrvProc, 2));
    int iLen = srv_paramlen(pSrvProc, 2);
  SendMsg(pSrvProc, "xp_TestProc: 2nd argument (Token) is %.*s", iLen, sToken);
 
    
  DBPROCESS*  dbproc;         // DBPROCESS handle for the new connection
  LOGINREC*   loginrec;
  char        szBindToken[MAX_BINDTOKEN];
  short       nCols;            // Data columns returned     
  DBINT       nRowsFetched;     // Number of rows sent       
  int         bImpersonated;
  RETCODE     rc;             // Value returned from DB-Library calls      
 
 
 
 
  // Get a loginrec and register our error and message handlers.
  loginrec = dblogin();
  dbprocerrhandle(loginrec, (DBERRHANDLE_PROC) err_handler);
  dbprocmsghandle(loginrec, (DBMSGHANDLE_PROC) msg_handler);
 
  // Check for integrated security.
  if (strcmp(srv_pfield(pSrvProc, SRV_LSECURE, NULL), "TRUE") == 0) {
    // Client has accessed using some form of integrated security
    // Impersonate client and set DBSETLSECURE flag
    bImpersonated = srv_impersonate_client( pSrvProc );
    DBSETLSECURE(loginrec);
  }
  else {
    // Set the user name, password, and application name for the remote
    DBSETLUSER( loginrec, srv_pfield(pSrvProc, SRV_USER, NULL) );
    DBSETLPWD( loginrec, srv_pfield(pSrvProc, SRV_PWD, NULL) );
  }
 
  DBSETLAPP (loginrec, "xp_gettable_dblib");
 
  // Since the servername parameter is set to NULL, the connection will be
  // opened to the local DBMS.
  dbproc = dbopen (loginrec, NULL);
 
  dbsetuserdata (dbproc, (VOID*) pSrvProc);
 
  // Bind to the clients connection for shared transaction space.
  srv_getbindtoken (pSrvProc, szBindToken); // The same as came in 2nd parameter
  dbfcmd (dbproc, "exec sp_bindsession \'%s\'", szBindToken); 
  dbsqlexec (dbproc);
 
 
    //int i1,i2=0;
    //i1 = i1/i2;
 
 
  // Prepare command (see also dbfcmd).
    //NB! Can't use temporary tables
  if(dbcmd(dbproc, "select Id, Name from RigFinOct..Security order by Name") == FAIL) throw XP_ERRORDBCOMMAND;
  if(dbsqlexec(dbproc) == FAIL) throw XP_ERRORDBCOMMAND;
    
  // Process the results.
  while ((rc = dbresults(dbproc)) != NO_MORE_RESULTS) {     //Several recordsets may be received???
        // How many data columns are in the row?
    nCols = dbnumcols(dbproc);
        SendMsg(pSrvProc, "xp_TestProc: %d columns in the current recordset.", nCols);
        if(nCols != 2) throw XP_ERRORCOLQUANTITY;
        
        //Check types of columns. Throw error, if wrong type. (iCol is used in error message.)
        CheckColumnType(dbproc,iCol=1,SQLINT4);
        CheckColumnType(dbproc,iCol=2,SQLCHAR); 
    nRowsFetched = 0;  // Initialize a counter for the row number.
 
        DBINT iId;
        int iRes = srv_describe(pSrvProc,1,"Id",SRV_NULLTERM,SRVINT4,4,SRVINT4,4,&iId);
        if(0==iRes) throw XP_ERRORDESCRIBE;
        iRes = srv_describe(pSrvProc,2,"Result",SRV_NULLTERM,SRVBIGVARCHAR,512,SRVBIGVARCHAR,512,sMsg);
        if(0==iRes) throw XP_ERRORDESCRIBE;
 
//      Only if they are a-changing:
//      iRes = srv_setcoldata(pSrvProc,1,&iId);
//      iRes = srv_setcoldata(pSrvProc,2,sMsg);
        
        STATUS st;
    while ((st = dbnextrow(dbproc)) == REG_ROW) {
          ++nRowsFetched;
            iId = *((DBINT *)dbdata(dbproc, 1));
            char * sName = (char *)dbdata(dbproc,2); //NB!!! Russian chars are fucked up in debug mode!!! (Because of console.)
            DBINT iLen = dbdatlen(dbproc, 2);
            sName[iLen] = 0;
            _snprintf(sMsg, sizeof(sMsg), "xp_TestProc: %d \"%s\"", iId+iArg1, sName);
//          SendMsg(pSrvProc, "xp_TestProc: %d \"%s\"", iId+iArg1, sName);  //NB!!! If used, spoils srv_sendrow() below.
 
            if(srv_sendrow(pSrvProc) == FAIL) throw XP_ERRORSENDROW;
    }
        switch(st) {
        case NO_MORE_ROWS: 
            srv_senddone(pSrvProc,SRV_DONE_MORE,0,0);       
            break;
        case FAIL:
        default: throw XP_ERRORNEXTROW;
        }
 
 
        
        SendMsg(pSrvProc, "xp_TestProc: %d rows received.", nRowsFetched);
    }
 
    
 
}//end try block
catch(SRVRETCODE RC) {
    RetCode = RC;
}
 
catch(...) {
    RetCode = XP_ERRORUNKNOWN;
}
 
 
switch(RetCode) {
case XP_NOERROR:
    SendMsg (pSrvProc, "xp_TestProc: Success.");
    break;
case XP_ERRORPARAMQUANTITY:
    SendError (pSrvProc, "xp_TestProc: Wrong quantity of parameters for xp_TestProc (must be 2).");
    break;
case XP_ERRORPARAMINFO:
    SendError (pSrvProc, "srv_paraminfo failed.");
    break;
case XP_ERRORPARAMTYPE:
        SendError (pSrvProc, "xp_TestProc: Wrong type of parameter #%i.", iParamNumber);
        break;
case XP_ERRORDBCOMMAND:
    SendError (pSrvProc, "DB command failed."); 
    break;
case XP_ERRORCOLQUANTITY: 
    SendError(pSrvProc, "xp_TestProc: Wrong number of columns (must be 2).");
    break;
case XP_ERRORCOLTYPE: 
    SendError(pSrvProc, "xp_TestProc: Wrong type of column %d.", iCol);
    break;
case XP_ERRORDESCRIBE:
    SendError(pSrvProc, "xp_TestProc: srv_describe failed.");
    break;
case XP_ERRORNEXTROW:
    SendError(pSrvProc, "xp_TestProc: srv_nextrow failed.");
    break;
case XP_ERRORSENDROW:
    SendError(pSrvProc, "xp_TestProc: srv_sendrow failed.");
    break;
 
 
 
case XP_ERRORUNKNOWN:
    SendError (pSrvProc, "xp_TestProc: Unknown error.");
    break;
}//end switch
 
 
 
return RetCode;
 
}
 
 
 
/*--------------------------------------------------------------------------CheckParamType
 
*/
void CheckParamType(SRV_PROC *pSrvProc, int iParamNumber, BYTE bNeededType)
{
  BYTE  bType; ULONG    cbMaxLen; ULONG cbActualLen; BOOL   fNull;
  if (srv_paraminfo(pSrvProc, iParamNumber, &bType, &cbMaxLen, &cbActualLen, NULL, &fNull) == FAIL) 
        throw XP_ERRORPARAMINFO;    
  
    if(bType != bNeededType) throw XP_ERRORPARAMTYPE;
}
 
 
/*--------------------------------------------------------------------------CheckColumnType
 
*/
void CheckColumnType(DBPROCESS* dbproc, int iColNumber, int iType)
{
    if(dbcoltype(dbproc,iColNumber) != iType) throw XP_ERRORCOLTYPE;
}
 
 
 
 
/*--------------------------------------------------------------------------SendError
send szErrorMsg to client
*/
void SendError (SRV_PROC *pSrvProc, CHAR* szErrorMsg,...)
{
    char sMsg[1024];
  va_list vl;
    va_start( vl,szErrorMsg);
    _vsnprintf(sMsg,sizeof(sMsg),szErrorMsg,vl); 
  srv_sendmsg(pSrvProc, SRV_MSG_ERROR, XP_HELLO_ERROR, SRV_FATAL_PROCESS, 1,
          NULL, 0, (DBUSMALLINT) __LINE__, sMsg, SRV_NULLTERM);
 
  srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
  // A SRV_DONE_MORE instead of a SRV_DONE_FINAL must complete the
  // result set of an Extended Stored Procedure.
  //else srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
}
 
 
/*--------------------------------------------------------------------------SendMsg
send szInfoMsg to client
*/
void SendMsg (SRV_PROC *pSrvProc, CHAR* szInfoMsg,...)
{
    char sMsg[1024];
  va_list vl;
    va_start( vl,szInfoMsg);
    _vsnprintf(sMsg,sizeof(sMsg),szInfoMsg,vl); 
  srv_sendmsg(pSrvProc, SRV_MSG_INFO, 0, SRV_INFO, 1,
          NULL, 0, (DBUSMALLINT) __LINE__, sMsg, SRV_NULLTERM);
 
  srv_senddone(pSrvProc, SRV_DONE_MORE, 0, 0);
}
2. Никак. В С/C++ нет запрета на выход индекса за пределы. Либо нужен свой класс массива. В любом учебнике есть примеры.
3. Молодец. Прдолжай изучать.
MadDog_
1 / 1 / 0
Регистрация: 04.04.2007
Сообщений: 23
09.05.2007, 21:29  [ТС]     Как генерировать исключения? #4
Спасибо огромное :-)
Yandex
Объявления
09.05.2007, 21:29     Как генерировать исключения?
Ответ Создать тему
Опции темы

Текущее время: 15:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru