2010-05-26 55 views
2

我再次谈到关于MVC的另一个问题。ASP.MVC中的例外

这是交易。我有一个简单的表/类与一个Id和一个名称。名字被认为是独一无二的,并且在DB中被模拟。

我创建了我的控制器,一切正常。但是,如果我尝试插入已经存在的名称,应该抛出异常。我只是没有找到什么是正确的异常,它是名称空间。错误必须来自数据库,所以...

任何想法?

谢谢

+0

你说的“我只是没有找到什么是正确类型的异常和意思它是命名空间。“ – 2010-05-26 02:59:16

+0

我不想抛出一个消息的通用异常:“有一个数据库错误”。我想抛出一个特定的异常,如...“唯一键违反 - 名称应该是唯一的”。 – 2010-05-26 03:02:44

回答

2

只需声明自己的异常类。

public class DuplicateNameException : Exception {} 

你可能想添加一些构造,以确保消息被适当地设置,但它并不需要比这更困难。

从OP中澄清后更新:因此,数据库抛出异常,您只是想让问题更明显。在这种情况下,我建议你将数据库例外保存为InnerException,并重新推出更好的东西。所以申报DuplicateNameException因为这样的事情:你需要做的DB操作

public class DuplicateNameException : Exception 
{ 
    public DuplicateNameException(DBException ex) 
     : base("Duplicate name!", ex) 
    {} 
} 

然后:

try 
{ 
    DoDatabaseOperation(); 
} 
catch (DBException ex) 
{ 
    if (IsDuplicateNameException(ex)) 
    { 
     throw new DuplicateNameException(ex); 
    } 
    else 
    { 
     throw; // use the no-argument form of "throw" to ensure you don't break the stack trace! 
    } 
} 
+0

当然,我可以这样做,但有没有一种方式与MVC来确定先验哪个错误是由数据库生成的? 谢谢 – 2010-05-26 03:42:16

+0

@George,我不清楚你的问题。这是一个例外情况,它已被*数据库层抛出,您希望获得更好的消息,或者希望抛出新的异常? – 2010-05-26 14:14:27

+0

你好JS。我的异常已经被数据库层抛出。我管理这个工作的方式是查找特定的数据库错误号并添加特定的消息。不是最漂亮的方式,但它的工作原理。有任何想法吗? – 2010-05-26 17:53:30