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

View File

@ -64,7 +64,19 @@ Serial::SerialImpl::open ()
if (fd_ == -1) 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(); reconfigurePort();
@ -215,7 +227,7 @@ Serial::SerialImpl::available ()
} }
else else
{ {
throw IOException ("ioctl"); throw IOException (errno);
} }
} }
@ -244,8 +256,7 @@ Serial::SerialImpl::read (char* buf, size_t size)
if (r == -1) if (r == -1)
{ {
perror("select()"); throw IOException (errno);
exit(EXIT_FAILURE);
} }
} }
@ -276,12 +287,27 @@ Serial::SerialImpl::read (char* buf, size_t size)
size_t size_t
Serial::SerialImpl::write (const string &data) Serial::SerialImpl::write (const string &data)
{ {
if (isOpen_ == false) { if (isOpen_ == false)
{
throw PortNotOpenedException ("Serial::write"); throw PortNotOpenedException ("Serial::write");
} }
ssize_t n = ::write (fd_, data.c_str (), data.length ()); 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); return static_cast<size_t> (n);
} }

View File

@ -167,7 +167,7 @@ Serial::readlines(string eol)
{ {
if (pimpl_->getTimeout () < 0) 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 (); size_t leneol = eol.length ();
vector<string> lines; vector<string> lines;
@ -339,3 +339,4 @@ bool Serial::getCD ()
{ {
return pimpl_->getCD (); return pimpl_->getCD ();
} }