- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个对电子邮件地址有唯一约束的帐户表。
我的代码经过几层 Controller ->服务->存储库-> Nhibernate
在存储库中,违反唯一键会引发错误。我想在我的服务层中捕获此错误,因此我尝试对其进行捕获。但是,不幸的是,该错误直接通过服务层传递给了MVC。
这是我的代码示例。
首先是 Controller :
NewAccountRequest request = new NewAccountRequest()
{
EmailAddress = model.EmailAddress,
FirstName = model.FirstName,
LastName = model.LastName,
Password = model.Password
};
try
{
accountService.RegisterAccount(request);
//send the user off to recieve their activation e-mail
return RedirectToAction("SendActivation", new { id = model.EmailAddress });
}
catch (EmailAlreadyRegisteredException)
{
ModelState.AddModelError("EmailAddress", String.Format("The email address {0} is already registered. <a href=\"/SignIn\">Sign In</a>", model.EmailAddress));
}
public void RegisterAccount(NewAccountRequest request)
{
Account account = new Account()
{
EmailAddress = request.EmailAddress,
Password = request.Password
};
Profile profile = new Profile()
{
EmailAddress = request.EmailAddress,
Name = new Profile.ProfileName() { FirstName = request.FirstName, LastName = request.LastName }
};
try
{
accountRepository.SaveWithDependence<Profile>(account, profile);
}
catch (System.Data.SqlClient.SqlException ex)
{
if (ex.Message.ToUpper().Contains("VIOLATION OF UNIQUE KEY"))
throw new EmailAlreadyRegisteredException();
else
throw;
}
catch (Exception ex)
{
if (ex.Message.ToUpper().Contains("VIOLATION OF UNIQUE KEY"))
throw new EmailAlreadyRegisteredException();
else
throw;
}
}
//repository registration
For(typeof(MySite.Data.IRepository<>)).Singleton().Use(typeof(MySite.Infrastructure.Repository<>));
//services
For<MySite.Services.IEmailService>().Singleton().Use<MySite.Services.Impl.BasicEmailService>()
.Ctor<string>("activationUrlFormat").Is(ConfigurationHelper.UrlFormats.ActivationLink) //{0} is the email address, {1} is the HMAC
.Ctor<string>("passwordResetUrlFormat").Is(ConfigurationHelper.UrlFormats.ResetPasswordLink); //{0} is the email address, {1} is the HMAC
For<MySite.Services.IAccountService>().Singleton().Use<MySite.Services.Impl.AccountService>()
.Ctor<int>("activationLinkLifeSpan").Is(ConfigurationHelper.Defaults.ActivationLinkLifespan) //In hours
.Ctor<int>("passwordResetLinkLifeSpan").Is(ConfigurationHelper.Defaults.ResetPasswordLinkLifespan); //In hours
For<MySite.Services.IProfileService>().Singleton().Use<MySite.Services.Impl.ProfileService>();
IRepository<Account> accountRepository;
IRepository<Profile> profileRepository;
IEmailService emailService;
int activationLinkLifeSpan;
int passwordResetLinkLifeSpan;
public AccountService(IRepository<Account> accountRepository, IRepository<Profile> profileRepository, IEmailService emailService,
int activationLinkLifeSpan, int passwordResetLinkLifeSpan)
{
this.accountRepository = accountRepository;
this.profileRepository = profileRepository;
this.emailService = emailService;
this.activationLinkLifeSpan = activationLinkLifeSpan;
this.passwordResetLinkLifeSpan = passwordResetLinkLifeSpan;
}
Violation of UNIQUE KEY constraint 'U_Email'. Cannot insert duplicate key in object 'dbo.WebAccounts'.
The statement has been terminated.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'U_Email'. Cannot insert duplicate key in object 'dbo.WebAccounts'.
The statement has been terminated.
Source Error:
Line 81: using (ITransaction tx = Session.BeginTransaction())
Line 82: {
Line 83: Session.SaveOrUpdate(entity);
Line 84: Session.SaveOrUpdate(dependant);
Line 85: tx.Commit();
Source File: C:\Users\Josh\Documents\Visual Studio 2010\Projects\MySite.Web\MySite.Infrastructure\Repository.cs Line: 83
Stack Trace:
[SqlException (0x80131904): Violation of UNIQUE KEY constraint 'U_Email'. Cannot insert duplicate key in object 'dbo.WebAccounts'.
The statement has been terminated.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2030802
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5009584
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2275
System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
System.Data.SqlClient.SqlDataReader.get_MetaData() +86
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +311
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() +12
NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) +278
NHibernate.Id.InsertSelectDelegate.ExecuteAndExtract(IDbCommand insert, ISessionImplementor session) +52
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) +83
[GenericADOException: could not insert: [MySite.Core.Model.Account][SQL: INSERT INTO WebAccounts (EmailAddress, IsActivated, Password) VALUES (?, ?, ?); select SCOPE_IDENTITY()]]
NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) +226
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Boolean[] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session) +204
NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Object obj, ISessionImplementor session) +184
NHibernate.Action.EntityIdentityInsertAction.Execute() +150
NHibernate.Engine.ActionQueue.Execute(IExecutable executable) +117
NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +502
NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +323
NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +130
NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) +27
NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) +63
NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) +89
NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) +191
NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) +260
NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj) +256
MySite.Infrastructure.Repository`1.SaveWithDependence(T entity, K dependant) in C:\Users\Josh\Documents\Visual Studio 2010\Projects\MySite.Web\MySite.Infrastructure\Repository.cs:83
MySite.Services.Impl.AccountService.RegisterAccount(NewAccountRequest request) in C:\Users\Josh\Documents\Visual Studio 2010\Projects\MySite.Web\MySite.Services\Impl\AccountService.cs:50
MySite.Web.Controllers.RegisterController.Index(NewUserRegistrationModel model) in C:\Users\Josh\Documents\Visual Studio 2010\Projects\MySite.Web\MySite.Web\Controllers\RegisterController.cs:66
lambda_method(Closure , ControllerBase , Object[] ) +108
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +51
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +409
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +52
System.Web.Mvc.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a() +127
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +436
System.Web.Mvc.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() +61
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +436
System.Web.Mvc.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() +61
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +436
System.Web.Mvc.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() +61
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +436
System.Web.Mvc.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() +61
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +305
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +830
System.Web.Mvc.Controller.ExecuteCore() +136
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +65
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +44
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +42
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +141
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8841105
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
最佳答案
我无法想象这与StructureMap有关。如果容器正确地解决了您的依赖关系,则表明容器正在执行其工作(并且已正确配置了它)。
您是否已逐步检查代码以确保(例如)正确捕获并重新抛出服务中的正确异常?
设置一些断点,看看您是否对实际发生的事情是正确的。
关于c# - StructureMap-服务/存储库体系结构-未在服务中捕获的异常被传递回应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4081256/
多个 ChildException catch block 和一个 Exception catch block 之间哪个更好? 更好,我的意思是以良好的实践方式。 举例说明: public stati
我正在尝试将脱机计算机记录在文本文件中,以便以后可以再次运行它们。似乎没有被记录或捕获。 function Get-ComputerNameChange { [CmdletBinding()]
我正在将 Scala 'try/catch' 测试代码转换为使用 'intercept' 有没有我不应该使用“拦截”的场景?使用 'intercept' 而不是 'try/catch' 的唯一好处是简
我对erlang很陌生,我正在尝试使用基本的try/catch语句来工作。我正在使用Webmachine处理一些请求,我真正想做的就是解析一些JSON数据并将其返回。如果JSON数据无效,我只想返回一
我不知道如何捕获删除按键。我发现在 ASCII 代码表中,它位于 127 位,但是 if (Key = #127) then 却无济于事。 然后我检查了 VK_DELETE 的值,它是 47。尝试使用
我很少在失败时对数据库查询使用唯一的错误消息 我经常使用简短的标准消息,例如“数据库错误/失败。请与网站管理员联系”或类似的消息。或自动发送给我 我正在寻找一种在PDO中全局设置一次try {}和ca
我有一个变量CompletableFuture completableFuture 。我希望能够使用任何类型的对象来完成它。例如:completableFuture.complete(new Stri
我认为这是基本的东西,但我不知道该怎么做。为什么我得到 IOException never throw in body of相应的 try 语句 public static void main(Str
我在此代码中遇到 JSON 异常: JSONObject jObject = new JSONObject(JSONString); pontosUsuario.setIdUsuari
我正在尝试打印出用单引号括起来的文本。 /bin/bash -lc '/home/CASPER_REPORTS/scripts/CASPER_gen_report.sh CASPER_1' /bin/
我这里遇到了一点问题。我想弄清楚如何捕获 IllegalArgumentException。对于我的程序,如果用户输入负整数,程序应该捕获 IllegalArgumentException 并询问用户
我无法理解 EJBTransactionRolledbackException。 我有实体: @Entity public class MyEntity { @Id @Generate
对于我给自己提出的以下挑战,如果社区的经验给我任何建议,我将不胜感激 - 即,这里有任何关于最佳方法/方向的指示吗? 要求 允许收集/实时监控从用户 Windows PC 到一组特定 IP 地址(或
我想在我的 ABAP 代码中捕获并处理 SAPSQL_DATA_LOSS。 我试过这个: try. SELECT * FROM (rtab_name) AS rtab
我知道捕获错误不是一个好的做法,但在这种情况下,这样做很重要。我正在尝试运行一个包含游戏一部分的 jar,但它给了我一个 unsatisfiedlink 错误,但这是有趣的部分:我正在使用这段代码:
我有一个表单页面,当我保存它时,它会覆盖数据库。表单页面中有一个文本框,允许用户输入 4000 个字符,但如果用户输入的字符超过此值,则会出现以下错误: ERROR 15:54:05 Abstrac
我想知道在python中绑定(bind)键的最简单方法 例如,默认的 python 控制台窗口出现并等待,然后在 psuedo -> if key "Y" is pressed: print (
下面是别人写的类。 我面临的问题是,当它进入parse method时与 null as the rawString ,它正在扔NumberFormatException 。 所以我想做的是,我应该捕
我有一个简单的脚本,可以捕获所有鼠标单击,除非您单击实际有效的内容。链接、Flash 视频等。我如何调整它,以便无论用户点击什么,在视频加载、新页面加载等之前,它都会发送我构建的简单 GET 请求?
我有一个带有一些选择列表的表单,当选择某些值时,这些列表将显示/隐藏更多输入字段。 问题是大多数用户都是数据输入人员,因此他们在输入数据时大量使用键盘,并且选择列表的 change 事件仅在焦点离开输
我是一名优秀的程序员,十分优秀!