Boost logo

Boost Users :

Subject: Re: [Boost-users] [iostream] exception propogation
From: Anand Patel (anand.apatel_at_[hidden])
Date: 2010-02-24 17:26:19


Below are snippet of my filters and stream. I have also tried with 1.42
without any success. Also, I have noticed the stream fail bit setting
correctly upon exception but not exception itself.

Multichar content recognition filter

////////////////////////////////////////////////////////////////

        class content_recognition_filter: public multichar_dual_use_filter
        {
        public:
            content_recognition_filter():
            multichar_dual_use_filter(),
                eof_reached(false),
                read_header(false)
            { }
            template <typename Source>
            std::streamsize read(Source & src, char * buf, std::streamsize
n)
            {
                unsigned int count = 0;
                if(eof_reached)
                    return -1;
                if(!read_header)
                {
                    // read the header, if error occurs throw exception
                    if(!special_read_header(src))
                    {
                        eof_reched = true;
                        read_header = true;
                        throw BOOST_IOSTREAMS_FAILURE("unknown data");
                    }
                }
                int c = 0;
            while(
                count < n &&
                !((c = boost::iostreams::get(src)) != EOF || (c !=
WOULD_BLOCK))
                )
                {
                    buf[count++] = c;
                }
                if(c==EOF)
                    eof_reached = true;
                return count == 0 && c != WOULD_BLOCK ? -1 :
static_cast<streamsize>(count);
            }

////////////////////////////////////////////////////////////////
Stream that uses above filter with other filters.

#include "content_recognition_filter.hpp"

        class my_stream
            : public boost::iostreams::filtering_ostream
        {
           my_stream(const std::string & path)
{
  push(boost::iostreams::unix2dos_stdio_filter());
// my filter
  push(content_recognition_filter());
            push(boost::iostreams::file_source(path,
std::ios_base::binary));
            if(!is_open())
                setstate(std::ios::badbit);
}
        }

////////////////////////////////////////////////////////////////
#include <iostream>
#include "mystream.h"
using namespace std;
int main()
{
  my_stream("file_name");
  try
{
  int c =0;
  while( (c = my_stream.get()) != EOF)
}
catch(...)
{
  cout<<"Caught an exception"<<endl;
  return -1;
}
return 0;
}

I am interested in knowing why behavior is different on two different
platforms. Do I need to enable some preprocesser or need to do anything
special on the Windows side to propagate exception to the user code.

-Anand

On Wed, Feb 24, 2010 at 1:01 PM, eg <egoots_at_[hidden]> wrote:

> On 2/24/2010 8:18 AM, Anand Patel wrote:
>
>> I came across interesting exception propagation behavior across
>> different platform (win32, linux). I have created several filters and
>> custom filtering stream with my filters (boost 1.38-1.41). My filter
>> throws BOOST_IOSTREAMS_FAILURE("some message"); whenever error condition
>> occurs. On Linux exception gets propagated all the way to user using my
>> stream. On Windows XP (VS 2008) it gets caught somewhere in boost
>> framework or Windows. Moreover, after exception is silently caught and
>> dropped, all the filters close method is called. This is where I run
>> into issue.
>> Is there anyway to ensure that upon exception no more data processing
>> takes place withing filtering_stream and its chain?
>>
>>
> I could be wrong, but I am not sure if anyone can really help without
> seeing some sample code.
>
> In any case, you may wish to try your tests again using boost 1.42 if only
> because there were some exception related fixes that made it into the
> iostreams library in this version.
>
> For details on the iostreams fixes in this release, see:
> http://www.boost.org/doc/libs/1_42_0/libs/iostreams/doc/release_notes.html
>
>
>
>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net