1
0
mirror of https://github.com/wjwwood/serial.git synced 2026-01-22 19:54:57 +08:00

Updating the error handling.

This commit is contained in:
John Harrison 2012-01-23 13:09:14 -06:00
parent 382a7f68b0
commit 8b2c7d4359
3 changed files with 71 additions and 30 deletions

View File

@ -83,39 +83,53 @@ typedef enum {
FLOWCONTROL_HARDWARE
} flowcontrol_t;
class SerialExecption : public std::exception {
const char * e_what;
class SerialExecption : public std::exception
{
const char* e_what_;
public:
SerialExecption(const char *description) {e_what=description;};
virtual const char* what() const throw() {
std::stringstream ss;
ss << "SerialException " << this->e_what << " failed.";
return ss.str().c_str();
SerialExecption (const char *description) : e_what_ (description) {}
virtual const char* what () const throw ()
{
std::stringstream ss;
ss << "SerialException " << e_what_ << " failed.";
return ss.str ().c_str ();
}
};
class IOException : public std::exception {
const char * e_what;
class IOException : public std::exception
{
const char* e_what_;
int errno_;
public:
IOException(const char * description) {e_what = description;}
explicit IOException (int errnum) : e_what_ (strerror (errnum)), errno_(errnum) {}
explicit IOException (const char * description) : e_what_ (description), errno_(0) {}
virtual const char* what() const throw() {
std::stringstream ss;
ss << "IO Exception " << this->e_what << " failed.";
return ss.str().c_str();
}
int getErrorNumber () { return errno_; }
virtual const char* what () const throw ()
{
std::stringstream ss;
if (errno_ == 0)
ss << "IO Exception " << e_what_ << " failed.";
else
ss << "IO Exception " << errno_ << ":" << e_what_ << " failed.";
return ss.str ().c_str ();
}
};
class PortNotOpenedException : public std::exception {
const char * e_what;
class PortNotOpenedException : public std::exception
{
const char * e_what_;
public:
PortNotOpenedException(const char * description) {e_what = description;}
PortNotOpenedException (const char * description) : e_what_ (description) {}
virtual const char* what() const throw() {
virtual const char* what () const throw ()
{
std::stringstream ss;
ss << e_what << " called before port was opened.";
return ss.str().c_str();
}
ss << e_what_ << " called before port was opened.";
return ss.str ().c_str ();
}
};

View File

@ -64,7 +64,19 @@ Serial::SerialImpl::open ()
if (fd_ == -1)
{
throw IOException ("invalid file descriptor");
switch (errno)
{
case EINTR:
// Recurse because this is a recoverable error.
open ();
return;
case ENFILE:
case EMFILE:
throw IOException ("to many file handles open");
break;
default:
throw IOException (errno);
}
}
reconfigurePort();
@ -215,7 +227,7 @@ Serial::SerialImpl::available ()
}
else
{
throw IOException ("ioctl");
throw IOException (errno);
}
}
@ -244,8 +256,7 @@ Serial::SerialImpl::read (char* buf, size_t size)
if (r == -1)
{
perror("select()");
exit(EXIT_FAILURE);
throw IOException (errno);
}
}
@ -276,12 +287,27 @@ Serial::SerialImpl::read (char* buf, size_t size)
size_t
Serial::SerialImpl::write (const string &data)
{
if (isOpen_ == false) {
if (isOpen_ == false)
{
throw PortNotOpenedException ("Serial::write");
}
ssize_t n = ::write (fd_, data.c_str (), data.length ());
if (n == -1) {
throw IOException ("Write");
if (n != static_cast<ssize_t> (data.length ()))
{
throw IOException ("Write did not complete");
}
else if (n == -1)
{
if (errno == EINTR)
{
return write (data);
}
else
{
throw IOException (errno);
}
}
return static_cast<size_t> (n);
}

View File

@ -167,7 +167,7 @@ Serial::readlines(string eol)
{
if (pimpl_->getTimeout () < 0)
{
throw "Error, must be set for readlines";
throw invalid_argument ("Error, must be set for readlines");
}
size_t leneol = eol.length ();
vector<string> lines;
@ -339,3 +339,4 @@ bool Serial::getCD ()
{
return pimpl_->getCD ();
}