2010-06-03 79 views
5

这是一个典型的函数,返回true/false;C#可能有一个通用的返回类型?

private static bool hasValue() 
{ 
    return true; 
} 

现在上的错误,我想和定义回到我自己的自定义错误对象:

public class Failure 
    { 
     public string FailureDateTime { get; set; } 
     public string FailureReason { get; set; } 
    } 

我本来期望能够抛出这个自定义对象例如...

private static bool hasValue() 
{ 
    try 
     { 
      ...do something 
     } 
    catch 
     { 
     throw new Failure(); 
     } 
    return true; 
} 

这是不可能的,我不想从System.IO.Exception派生失败,因为我个人有问题序列化C#中的异常(这是与.net v2)。

这个问题的最佳实践或理想解决方案是什么?我应该只使用私有静态对象吗?还是有一种更清晰的方式来返回自定义对象或绕过错误(不使用System.IO.Exception)的典型返回类型?

我对于使用一个对象也不是完全疯狂,因为那么我需要通过使用cast和更多布尔值来验证结果。

+0

我觉得唯一可以抛出的东西是从异常派生的东西。 – kenny 2010-06-03 11:31:34

回答

10

这种解决方案可以适应这种情况:

var exception = new Exception(); 
exception.Data.Add("Failure", new Failure()); 
throw exception; 

您可以抛出异常(建议定义自己的异常类型),并使用数据字典持有的失败。在catch代码中,您可以获取数据并将其序列化。如果您确实创建了自己的异常类型,则可以将故障置于属性中。

评论:我没有检查它,但你确定例外是不可序列化的吗?

+1

+1这很可爱。 – 2010-06-03 11:30:03

+0

我想我会实施这个解决方案,看起来很有希望。 – 2010-06-03 11:30:29

+0

我在实践中遇到了一些序列化异常的问题。 – 2010-06-03 11:34:38

7

我不想从System.IO.Exception派生失败,因为无法序列化C#中的异常。

该问题基于的假设是,您不能序列化从IOException派生的异常。但是我想挑战这个假设。 IOException被标记为Serializable。你所要做的就是将你的子类标记为可序列化的。

查看文档IOException

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public class IOException : SystemException 
6

你需要从System.Exception(或任何其他非sealed子类)来推导,如果你想创建自己的异常类。如果你没有序列化你正在谈论的可能是你没有实现序列化构造函数的事实。

Visual Studio有一个代码片段,为子类异常创建推荐的模板。您可以输入exception并按标签两次获得。

这是什么出来:

[Serializable] 
public class MyException : Exception { 
    public MyException() { } 
    public MyException(string message) : base(message) { } 
    public MyException(string message, Exception inner) : base(message, inner) { } 
    protected MyException(
     System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) 
     : base(info, context) { } 
} 
0

不要太担心这种情况;只需创建一个结果类型来封装所有这些逻辑。

public class ValueResult 
{ 
    public Failure FailureDetails {get;set;} 
    public bool Success {get;set;} 
    public bool HasValue {get;set;} 
    public object Value {get;set;} 
} 

从异常
var result = HasValue(); 
if(result.Success) 
    DoSomething(result.Value); 
else if(!result.Success) 
    LogFailure(result.FailureDetails); 
+1

...你可以用C风格的错误代码获得编程的优雅和健壮性......你如何让调用者的调用者知道并处理错误? – 2010-06-03 11:47:38

+0

至少使它通用,而不是使用普通对象。 – harms 2010-06-03 11:53:54

+0

@harms价值是他想要的;该解决方案并不是要在任何情况下使用的通用类(无需替换异常处理),而只是他的问题的另一种选择。所以如果Value应该是MintyGreenChocolate,他可以简单地将它切换为对象。 – Will 2010-06-03 16:18:27

0

你必须从异常继承这样的类:

[Serializable] 
public class Failure: Exception 
{ 
    public string ErrorMessage 
    { 
     get 
     { 
     return base.Message.ToString(); 
     } 
    } 

} 

然后

catch(Exception ex) 
{ 
    throw new Failure(
      "exception message here", ex.messege); 
} 
0

您也可以随时使用企业库的异常处理自定义异常提供自己的异常处理类,格式类型,测井等..

try 
{ 
} 
catch(Exception ex) 
{ 
    bool rethrow = ExceptionPolicy.HandleException(ex, "My Custom Policy"); 
    if (rethrow) 
    { 
     throw; 
    } 
} 
finally 
{ 
} 

例子:

http://weblogs.asp.net/sukumarraju/archive/2009/10/04/microsoft-enterprise-library-4-1-exception-handling-block.aspx

http://www.imason.com/imason_Blogs/b/suleman_ibrahim/archive/2009/05/25/configuring-enterprise-library-4-0-for-exception-handling-and-logging.aspx