推荐.NET教程: ASP.NET C# 开发环境 Ajax教程 控件开发 统计报表 数据库 Web服务 安装部署 CommunityServer NHibernate DataGrid/GridView 实用代码 VS2005
示例源码 MVC/三层 SqlHelper 入门源码 开源 CMS Ajax/Atlas C#.net 毕业设计 源码 经典代码 商业 本站作品 持久层 随书源码 WebService 英文/汉化 Asp.net2.0

阿牛·乐园

每天进步一点点

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  71 随笔 :: 14 文章 :: 369 评论 :: 13 Trackbacks

    在使用NH时,如果定义一个类的方法,须定义成virtual类型,这样才可以让NH自动产生代理类来调用此方法.但这时,有一个问题:如果我们这个方法中抛出了自己定义的异常,在外面会能得到自己的异常吗?

    public class People
    
{
        
public virtual void Eat(string food)
        
{
            
if (foot == "")
                
throw new ArgumentException();

            
if (foot == "")
                
throw new BusinessException();

            
        }


        
public static void ShowMessage(string message)
        
{}


        
public static void TestEatException()
        
{
            
try
            
{
                
this.Eat("");
            }

            
catch (ArgumentException)
            
{
                ShowMessage(
"没有东西吃");
            }

            
catch (BusinessException)
            
{
                ShowMessage(
"水应该不能吃,酒还说得过去");
            }

            
catch(Exception exp)
            
{
                ShowMessage(
"不应该出现这种异常的" + exp.GetType().Name);
            }

        }

    }


     想想TestEatException会出现什么异常?刚开始时,我以为是"水应该不能吃,酒还说得过去",但我错了.
     正确结果是"不应该出现这种异常TargetInvocationException".想来也是NH的反射搞得鬼.
但如果我们调试一下,发现异常的InnerException是我们自定义的期望抛出来的异常.哈哈.
     临时解决方法如下:
    public class People
    
{
        
public virtual void Eat(string food)
        
{
            
if (foot == "")
                
throw new ArgumentException();

            
if (foot == "")
                
throw new BusinessException();

            
        }


        
public static void ShowMessage(string message)
        
{}


        
public static void TestEatException()
        
{
            
try
            
{
                
try
                
{
                    
this.Eat("");
                }

                
catch (TargetInvocationException exp)
                
{
                    
if (exp.InnerException != null)
                        
throw exp.InnerException;
                }

            }

            
catch (ArgumentException)
            
{
                ShowMessage(
"没有东西吃");
            }

            
catch (BusinessException)
            
{
                ShowMessage(
"水应该不能吃,酒还说得过去");
            }

            
catch (Exception exp)
            
{
                ShowMessage(
"不应该出现这种异常的" + exp.GetType().Name);
            }

        }

    }


     这时就会出现"水应该不能吃,酒还说得过去"的信息了.如果您有更好的办法,一定要分享呀!
posted on 2007-05-11 10:55 阿牛 阅读(1288) 评论(3)  编辑 收藏 所属分类: ASP.netC#

评论

#1楼 [楼主] 2007-05-11 11:44 阿牛      
@荔树人家
??

  回复  引用  查看    

谢谢分享,已引用:
http://dotneturls.com/gb2312/blogs/20070511/104/NHibernate使用时_不能返回自己的异常的解决办法.aspx
  回复  引用    

#3楼  2007-05-18 08:59 大剑师      
楼主的方法不错
  回复  引用  查看