private void ErrorHandle(Exception ex, PersistentObject obj, string strMessage)
        {
            if (ex is PersistenceLayerException)
            {
                throw ex;
            }

            if (obj == null)
            {
                Assert.Fail(Error.DatabaseUnknownError, ex.Message + (strMessage != null ? strMessage : ""));
            }

            IPersistenceProvider rdb = this.GetDatabase(GetDatabaseName(obj));

            string strErr = "";
            Error  error  = rdb.ErrorHandler(ex, out strErr);

            if (error == Error.Unknown)
            {
                if (ex is InvalidCastException)
                {
                    switch (ex.TargetSite.Name)
                    {
                    case "RetrievePrivate":
                        strErr = obj.GetClassName() + "A type conversion exception occurred while the object was executing the Retrive() method!";
                        Assert.Fail(Error.Unknown, strErr);
                        break;

                    default:
                        Assert.Fail(Error.Unknown);
                        break;
                    }
                }
                Assert.Fail(Error.Unknown, ex.Message);
            }
            else
            {
                switch (error)
                {
                case Error.NotAllowDataNull:
                    strErr = obj.GetClassName() + "Some properties cannot be null";
                    Assert.Fail(error, strErr);
                    break;

                case Error.DataTypeNotMatch:
                    strErr = obj.GetClassName() + "Some attribute data types are not compatible with database data types";
                    Assert.Fail(error, strErr);
                    break;

                case Error.AutoValueOn:
                    strErr = obj.GetClassName() + "There is an automatic number attribute, you cannot specify a specific value";
                    Assert.Fail(error, strErr);
                    break;

                case Error.RestrictError:
                    strErr = "Trying to" + obj.GetClassName() + "Object operation, operation is terminated due to constraint mechanism";
                    Assert.Fail(error, strErr);
                    break;

                case Error.RequireAttribute:
                    strErr = "Trying to" + obj.GetClassName() + "Object operation, but the property is not specified or is null";
                    Assert.Fail(error, strErr);
                    break;

                case Error.NotUnique:
                    strErr = obj.GetClassName() + "The data of the object or its associated object conflicts with the existing data";
                    Assert.Fail(error, strErr);
                    break;

                case Error.DataTooLong:
                    strErr = obj.GetClassName() + "Data exceeds database capacity";
                    Assert.Fail(error, strErr);
                    break;

                case Error.NotAllowStringEmpty:
                    strErr = obj.GetClassName() + "The attribute in the character cannot be zero length";
                    Assert.Fail(error, strErr);
                    break;
                }
                strErr = obj.GetClassName() + "Object operation error," + ex.Message + (strMessage != null ? strMessage : "");
                Assert.Fail(error, strErr);
            }
        }