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:
parent
382a7f68b0
commit
8b2c7d4359
@ -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 ();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user