How to use exception handling?
I have a code which gets public IP address and one segment of code causes crash if not connected to internet. So I'm trying to apply exception handling, but I don't really understand how it works in this case, can you help me?
HTML Code:
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <locale>
#include <sstream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
string website_HTML;
locale local;
void get_Website(string url);
char lineBuffer[200][80] = { ' ' };
char buffer[10000];
char ip_address[16];
int i = 0, bufLen = 0, j = 0, lineCount = 0;
int lineIndex = 0, posIndex = 0;
//****************************************************
int main(void) {
cout << "\n\n\n";
try{
get_Website("api.ipify.org");
}
catch (const char* error)
{
}
for (size_t i = 0; i < website_HTML.length(); ++i) website_HTML[i] = tolower(website_HTML[i], local);
istringstream ss(website_HTML);
string stoken;
while (getline(ss, stoken, '\n')) {
//cout <<"-->"<< stoken.c_str() << '\n';
strcpy_s(lineBuffer[lineIndex], stoken.c_str());
int dot = 0;
for (int ii = 0; ii < strlen(lineBuffer[lineIndex]); ii++) {
if (lineBuffer[lineIndex][ii] == '.') dot++;
if (dot >= 3) {
dot = 0;
strcpy_s(ip_address, lineBuffer[lineIndex]);
}
}
lineIndex++;
}
cout << "Your IP Address is " << ip_address << " \n\n";
cout << "\nPress ANY key to close.\n\n";
cin.ignore(); cin.get();
return 0;
}
//****************************************************
void get_Website(string url) {
WSADATA wsaData;
SOCKET Socket;
SOCKADDR_IN SockAddr;
int lineCount = 0;
int rowCount = 0;
struct hostent *host;
string get_http;
get_http = "GET / HTTP/1.1\r\nHost: " + url + "\r\nConnection: close\r\n\r\n";
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
cout << "WSAStartup failed.\n";
system("pause");
//return 1;
}
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
host = gethostbyname(url.c_str());
SockAddr.sin_port = htons(80);
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0) {
cout << "Could not connect";
system("pause");
//return 1;
}
send(Socket, get_http.c_str(), strlen(get_http.c_str()), 0);
int nDataLength;
while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0) {
int i = 0;
while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
website_HTML += buffer[i];
i += 1;
}
}
closesocket(Socket);
WSACleanup();
}
Re: How to use exception handling?
Re: How to use exception handling?
Quote:
Originally Posted by
prako2
I have a code which gets public IP address and one segment of code causes crash if not connected to internet. So I'm trying to apply exception handling, but I don't really understand how it works in this case, can you help me?
...
Does this code compile?
I don't see where your get_Website function throws the exception you are trying to catch...
Re: How to use exception handling?
As Victor states, get_Website() doesn't raise an exception - so catch() will never be executed.
As in previous posts, you are not checking the return value from API functions for an error.
This will be the cause of the 'crash'. For example, gethostbyname() returns NULL if it fails. if you don't check for this and then dereference the returned pointer you will get a 'crash'.
I will re-iterate, for EVERY API call, you MUST ALWAYS check the return value for an error condition. The documentation for each API describes this.
Re: How to use exception handling?
Quote:
Originally Posted by
salem_c
Is your only contribution here to point out cross posts?
Re: How to use exception handling?
2kaud, thank you, I will keep that in mind.