using System;
using System.Security.Permissions;
namespace Csla
{
///
/// This exception is returned for any errors occuring
/// during the server-side DataPortal invocation.
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1032:ImplementStandardExceptionConstructors")]
[Serializable()]
public class DataPortalException : Exception
{
private object _businessObject;
private string _innerStackTrace;
///
/// Returns a reference to the business object
/// from the server-side DataPortal.
///
///
/// Remember that this object may be in an invalid
/// or undefined state. This is the business object
/// (and any child objects) as it existed when the
/// exception occured on the server. Thus the object
/// state may have been altered by the server and
/// may no longer reflect data in the database.
///
public object BusinessObject
{
get { return _businessObject; }
}
///
/// Gets the original server-side exception.
///
/// An exception object.
///
/// When an exception occurs in business code behind
/// the data portal, it is wrapped in a
/// , which
/// is then wrapped in a
/// . This property
/// unwraps and returns the original exception
/// thrown by the business code on the server.
///
public Exception BusinessException
{
get
{
return this.InnerException.InnerException;
}
}
///
/// Get the combined stack trace from the server
/// and client.
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "System.String.Format(System.String,System.Object,System.Object,System.Object)")]
public override string StackTrace
{
get { return String.Format("{0}{1}{2}", _innerStackTrace, Environment.NewLine, base.StackTrace); }
}
///
/// Creates an instance of the object.
///
/// Text describing the exception.
/// The business object
/// as it was at the time of the exception.
public DataPortalException(string message, object businessObject)
: base(message)
{
_innerStackTrace = String.Empty;
_businessObject = businessObject;
}
///
/// Creates an instance of the object.
///
/// Text describing the exception.
/// Inner exception.
/// The business object
/// as it was at the time of the exception.
public DataPortalException(string message, Exception ex, object businessObject)
: base(message, ex)
{
_innerStackTrace = ex.StackTrace;
_businessObject = businessObject;
}
///
/// Creates an instance of the object for serialization.
///
/// Serialiation info object.
/// Serialization context object.
protected DataPortalException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
: base(info, context)
{
_businessObject = info.GetValue("_businessObject", typeof(object));
_innerStackTrace = info.GetString("_innerStackTrace");
}
///
/// Serializes the object.
///
/// Serialiation info object.
/// Serialization context object.
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public override void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("_businessObject", _businessObject);
info.AddValue("_innerStackTrace", _innerStackTrace);
}
}
}