Index: /OpenSceneGraph/trunk/src/osgPlugins/ply/plyfile.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ply/plyfile.cpp (revision 10014)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ply/plyfile.cpp (revision 10040)
@@ -40,8 +40,12 @@
 
 #include "ply.h"
+#include"typedefs.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include <string.h>
+
+
 
 #ifdef WIN32
@@ -316,4 +320,6 @@
 
   plyfile = ply_write (fp, nelems, elem_names, file_type);
+
+  // If the plyfile could not load return NULL
   if (plyfile == NULL)
     return (NULL);
@@ -354,6 +360,7 @@
   elem = find_element (plyfile, elem_name);
   if (elem == NULL) {
-    fprintf(stderr,"ply_describe_element: can't find element '%s'\n",elem_name);
-    exit (-1);
+    char error[100];
+    sprintf (error, "ply_describe_element: can't find element '%s'\n",elem_name);
+    throw ply::MeshException( error );
   }
 
@@ -501,6 +508,7 @@
   elem = find_element (plyfile, elem_name);
   if (elem == NULL) {
-    fprintf(stderr,"ply_element_count: can't find element '%s'\n",elem_name);
-    exit (-1);
+    char error[100];
+    sprintf (error, "ply_element_count: can't find element '%s'\n",elem_name);
+    throw ply::MeshException( error );
   }
 
@@ -537,7 +545,8 @@
       break;
     default:
-      fprintf (stderr, "ply_header_complete: bad file type = %d\n",
+      char error[100];
+      sprintf (error, "ply_header_complete: bad file type = %d\n",
                plyfile->file_type);
-      exit (-1);
+      throw ply::MeshException( error );
   }
 
@@ -596,6 +605,7 @@
   elem = find_element (plyfile, elem_name);
   if (elem == NULL) {
-    fprintf(stderr, "ply_elements_setup: can't find element '%s'\n", elem_name);
-    exit (-1);
+    char error[100];
+    sprintf (error, "ply_elements_setup: can't find element '%s'\n", elem_name);
+    throw ply::MeshException( error );
   }
 
@@ -941,4 +951,10 @@
   plyfile = ply_read (fp, nelems, elem_names);
 
+  if(!plyfile)
+  {
+    std::cout<<"Ply File Error : Could not read file"<<std::endl;
+    return NULL;
+  }
+
   /* determine the file type and version */
 
@@ -1331,7 +1347,7 @@
   elem = find_element (plyfile, elem_name);
   if (elem == NULL) {
-    fprintf (stderr,
-             "ply_get_other_element: can't find element '%s'\n", elem_name);
-    exit (-1);
+    char error[100];
+    sprintf (error, "ply_get_other_element: can't find element '%s'\n", elem_name);
+    throw ply::MeshException( error );
   }
 
@@ -1651,6 +1667,7 @@
   words = get_words (plyfile->fp, &nwords, &orig_line);
   if (words == NULL) {
-    fprintf (stderr, "ply_get_element: unexpected end of file\n");
-    exit (-1);
+    char error[100];
+    sprintf (error, "ply_get_element: unexpected end of file\n");
+    throw ply::MeshException( error );
   }
 
@@ -1848,6 +1865,7 @@
 
   if (code <= PLY_START_TYPE || code >= PLY_END_TYPE) {
-    fprintf (stderr, "write_scalar_type: bad data code = %d\n", code);
-    exit (-1);
+    char error[100];
+    sprintf (error, "write_scalar_type: bad data code = %d\n", code);
+    throw ply::MeshException( error );
   }
 
@@ -2119,6 +2137,7 @@
       break;
     default:
-      fprintf (stderr, "write_binary_item: bad type = %d\n", type);
-      exit (-1);
+      char error[100];
+      sprintf (error, "write_binary_item: bad type = %d\n", type);
+      throw ply::MeshException( error );
   }
 }
@@ -2163,6 +2182,7 @@
       break;
     default:
-      fprintf (stderr, "write_ascii_item: bad type = %d\n", type);
-      exit (-1);
+      char error[100];
+      sprintf (error, "write_ascii_item: bad type = %d\n", type);
+      throw ply::MeshException( error );
   }
 }
@@ -2235,6 +2255,7 @@
       break;
     default:
-      fprintf (stderr, "get_stored_item: bad type = %d\n", type);
-      exit (-1);
+      char error[100];
+      sprintf (error, "get_stored_item: bad type = %d\n", type);
+      throw ply::MeshException( error );
   }
 }
@@ -2267,8 +2288,14 @@
 
   ptr = (void *) c;
+  size_t result = 0;
 
   switch (type) {
     case PLY_CHAR:
-      fread (ptr, 1, 1, plyfile->fp);
+      result = fread (ptr, 1, 1, plyfile->fp);
+      if(result < 1)
+      {
+          throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+      }
       *int_val = *((char *) ptr);
       *uint_val = *int_val;
@@ -2277,5 +2304,10 @@
       case PLY_UCHAR:
       case PLY_UINT8:
-          fread (ptr, 1, 1, plyfile->fp);
+          result = fread (ptr, 1, 1, plyfile->fp);
+          if(result < 1)
+          {
+              throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+          }
           *uint_val = *((unsigned char *) ptr);
           *int_val = *uint_val;
@@ -2283,5 +2315,10 @@
           break;
       case PLY_SHORT:
-          fread (ptr, 2, 1, plyfile->fp);
+          result = fread (ptr, 2, 1, plyfile->fp);
+          if(result < 1 )
+          {
+              throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+          }
           if( plyfile->file_type == PLY_BINARY_BE )
           {
@@ -2297,5 +2334,10 @@
           break;
       case PLY_USHORT:
-          fread (ptr, 2, 1, plyfile->fp);
+          result = fread (ptr, 2, 1, plyfile->fp);
+          if(result < 1)
+          {
+              throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+          }
           if( plyfile->file_type == PLY_BINARY_BE )
           {
@@ -2312,5 +2354,10 @@
       case PLY_INT:
       case PLY_INT32:
-          fread (ptr, 4, 1, plyfile->fp);
+          result = fread (ptr, 4, 1, plyfile->fp);
+          if(result < 1)
+          {
+              throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+          }
           if( plyfile->file_type == PLY_BINARY_BE )
           {
@@ -2326,5 +2373,10 @@
           break;
       case PLY_UINT:
-          fread (ptr, 4, 1, plyfile->fp);
+          result = fread (ptr, 4, 1, plyfile->fp);
+          if(result < 1)
+          {
+              throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+          }
           if( plyfile->file_type == PLY_BINARY_BE )
           {
@@ -2341,5 +2393,10 @@
       case PLY_FLOAT:
       case PLY_FLOAT32:
-          fread (ptr, 4, 1, plyfile->fp);
+          result = fread (ptr, 4, 1, plyfile->fp);
+          if(result < 1)
+          {
+              throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+          }
           if( plyfile->file_type == PLY_BINARY_BE )
           {
@@ -2355,5 +2412,10 @@
           break;
       case PLY_DOUBLE:
-          fread (ptr, 8, 1, plyfile->fp);
+          result = fread (ptr, 8, 1, plyfile->fp);
+          if(!result < 1)
+          {
+              throw ply::MeshException( "Error in reading PLY file."
+                                 "fread not succeeded." );
+          }
           if( plyfile->file_type == PLY_BINARY_BE )
           {
@@ -2369,6 +2431,7 @@
       break;
     default:
-      fprintf (stderr, "get_binary_item: bad type = %d\n", type);
-      exit (-1);
+      char error[100];
+      sprintf (error, "get_binary_item: bad type = %d\n", type);
+      throw ply::MeshException( error );
   }
 }
@@ -2425,6 +2488,7 @@
 
     default:
-      fprintf (stderr, "get_ascii_item: bad type = %d\n", type);
-      exit (-1);
+      char error[100];
+      sprintf (error, "get_ascii_item: bad type = %d\n", type);
+      throw ply::MeshException( error );
   }
 }
@@ -2497,6 +2561,7 @@
       break;
     default:
-      fprintf (stderr, "store_item: bad type = %d\n", type);
-      exit (-1);
+      char error[100];
+      sprintf (error, "store_item: bad type = %d\n", type);
+      throw ply::MeshException( error );
   }
 }
Index: /OpenSceneGraph/trunk/src/osgPlugins/ply/vertexData.cpp
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ply/vertexData.cpp (revision 10012)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ply/vertexData.cpp (revision 10040)
@@ -158,10 +158,21 @@
     float   version;
     bool    result = false;
-    int        nComments;
-    char**    comments;
-    
-    PlyFile* file = ply_open_for_reading( const_cast< char* >( filename ), 
+    int     nComments;
+    char**  comments;
+    
+    PlyFile* file = NULL;
+
+    // Try to open ply file as for reading
+    try{
+            file  = ply_open_for_reading( const_cast< char* >( filename ), 
                                           &nPlyElems, &elemNames, 
                                           &fileType, &version );
+    }
+    // Catch the if any exception thrown
+    catch( exception& e )
+    {
+        MESHERROR << "Unable to read PLY file, an exception occured:  " 
+                    << e.what() << endl;
+    }
 
     if( !file )
@@ -173,4 +184,5 @@
 
     MESHASSERT( elemNames != 0 );
+    
 
     nComments = file->num_comments;
@@ -196,6 +208,14 @@
         int nProps;
         
-        PlyProperty** props = ply_get_element_description( file, elemNames[i], 
-                                                           &nElems, &nProps );
+        PlyProperty** props = NULL;
+        try{
+                props = ply_get_element_description( file, elemNames[i], 
+                                                     &nElems, &nProps );
+        }
+        catch( exception& e )
+        {
+            MESHERROR << "Unable to get PLY file description, an exception occured:  " 
+                        << e.what() << endl;
+        }
         MESHASSERT( props != 0 );
         
@@ -222,12 +242,23 @@
             if( ignoreColors )
                 MESHINFO << "Colors in PLY file ignored per request." << endl;
-            
-            // Read vertices and store in a std::vector array
-            readVertices( file, nElems, hasColors && !ignoreColors );
-            // Check whether all vertices are loaded or not
-            MESHASSERT( _vertices->size() == static_cast< size_t >( nElems ) );
-            // Check all color elements read or not
-            if( hasColors && !ignoreColors )
-                MESHASSERT( _colors->size() == static_cast< size_t >( nElems ) );
+         
+            try {   
+                // Read vertices and store in a std::vector array
+                readVertices( file, nElems, hasColors && !ignoreColors );
+                // Check whether all vertices are loaded or not
+                MESHASSERT( _vertices->size() == static_cast< size_t >( nElems ) );
+                // Check all color elements read or not
+                if( hasColors && !ignoreColors )
+                    MESHASSERT( _colors->size() == static_cast< size_t >( nElems ) );
+            }
+            catch( exception& e )
+            {
+                MESHERROR << "Unable to read vertex in PLY file, an exception occured:  " 
+                            << e.what() << endl;
+                // stop for loop by setting the loop variable to break condition
+                // this way resources still get released even on error cases
+                i = nPlyElems;
+                
+            }
         }
         // If the string is face means triangle info started
Index: /OpenSceneGraph/trunk/src/osgPlugins/ply/typedefs.h
===================================================================
--- /OpenSceneGraph/trunk/src/osgPlugins/ply/typedefs.h (revision 10012)
+++ /OpenSceneGraph/trunk/src/osgPlugins/ply/typedefs.h (revision 10040)
@@ -20,5 +20,12 @@
 #   include <osg/Notify>
 #    include <cassert>
-#   define MESHASSERT  assert
+
+#ifdef NDEBUG
+#   define MESHASSERT( x )
+#else
+#    define MESHASSERT(x) { if( !(x) )                                      \
+              osg::notify(osg::WARN) << "Ply Loader ##### Assert: " << #x << " #####" << std::endl; }
+#endif
+
 #   define MESHERROR   osg::notify(osg::WARN)
 #   define MESHWARN    osg::notify(osg::WARN)
