如何抛出异常并添加包含键和值的消息?
本文关键字:键和值 消息 包含 添加 抛出异常 | 更新日期: 2023-09-27 18:18:21
我有这样的方法:
public IDictionary<string, string> Delete(Account account)
{
try { _accountRepository.Delete(account); }
catch { _errors.Add("", "Error when deleting account"); }
return _errors;
}
public IDictionary<string, string> ValidateNoDuplicate(Account ac)
{
var accounts = GetAccounts(ac.PartitionKey);
if (accounts.Any(b => b.Title.Equals(ac.Title) &&
!b.RowKey.Equals(ac.RowKey)))
_errors.Add("Account.Title", "Duplicate");
return _errors;
}
我想改变这个方法,使它返回一个bool值,这样它就会抛出一个异常,如果有错误,而不是:
_errors.Add("", "Error when deleting account");
有人能告诉我如何抛出异常并传递包含键和值的消息吗?在这种情况下,键是""
,值是"Error when deleting account"
。
也在调用this的方法中。如何捕获异常?
我有必要创建自己的类并以某种方式抛出基于这个类的异常吗?
创建您自己的异常类,它可以保存您需要的数据:
public class AccountException : ApplicationException {
public Dictionary<string, string> Errors { get; set; };
public AccountException(Exception ex) : base(ex) {
Errors = new Dictionary<string, string>();
}
public AccountException() : this(null) {}
}
可以在方法中抛出异常。也不要返回错误状态,那是由异常处理的。
不要丢弃你在方法中得到的异常,将其包含为InnerException
,以便它可以用于调试。
public void Delete(Account account) {
try {
_accountRepository.Delete(account);
} catch(Exception ex) {
AccountException a = new AccountException(ex);
a.Errors.Add("", "Error when deleting account");
throw a;
}
}
public void ValidateNoDuplicate(Account ac) {
var accounts = GetAccounts(ac.PartitionKey);
if (accounts.Any(b => b.Title.Equals(ac.Title) &&
!b.RowKey.Equals(ac.RowKey))) {
AccountException a = new AccountException();
a.Errors.Add("Account.Title", "Duplicate");
throw a;
}
}
调用方法时,捕获异常类型:
try {
Delete(account);
} catch(AccountException ex) {
// Handle the exception here.
// The ex.Errors property contains the string pairs.
// The ex.InnerException contains the actual exception
}
Exception
类有一个Data
属性,它是键/值对的字典。
IDictionary<string, string> errors;
...
if (errors.Count > 0)
{
Exception ex = ... construct exception of the appropriate type
foreach(string key in _errors.Keys)
{
ex.Data.Add(key, _errors[key]);
}
throw ex;
}
请注意,通常认为使用可序列化的exception是一种良好的实践,因此您放入Data字典中的对象也应该是可序列化的。在你的例子中,你只是输入字符串,所以你会很好。
我有必要创建自己的类并以某种方式抛出基于这个类的异常吗?
创建您自己的自定义Exception类当然不是必需的,也可能不是理想的。MSDN异常设计指南给出了选择抛出哪种异常类型的指南。
一般情况下,您应该更倾向于使用现有的异常类型之一,除非您有一个错误条件,可以用不同于现有异常类型的编程方式处理。
创建自己的异常,然后抛出。
public class RepositoryException : Exception
{
public RepositoryException() : base()
{
}
public RepositoryException(string key, string value) : base()
{
base.Data.Add(key, value);
}
public RepositoryException(string message) : base(message)
{
}
public RepositoryException(string message, Exception innerException) : base(message, innerException)
{
}
}
public Boolean Delete(Account account)
{
try
{
_accountRepository.Delete(account);
return true;
}
catch (Exception ex)
{
throw new RepositoryException("", "Error when deleting account");
// throw new RepositoryException("Error when deleting account", ex);
// OR just
// throw new RepositoryException("Error when deleting account");
}
}
你可以抛出你自己的异常,而不是
_errors.Add("", "Error when deleting account");
所以每个_errors.Add(..)
都会被替换成像
throw new MyAppException(key, value);
如何创建自己的异常类已经在上面解释过了。因此,您为异常对象提供键和值。
你应该知道你要捕获哪种异常类型
try {
Delete(account);
} catch(NullPointerException ex) {
throw new MyAppException(key, value);
}
现在在你的调用方法(外部方法)中,你只能捕获你的异常。
try {
_accountRepository.Delete(account);
} catch(MyAppException ex) {
//exception handle logic
}