我为我的应用程序不期望的每个条件创建了异常. UserNameNotValidException
,PasswordNotCorrectException
等等.
但是我被告知我不应该为这些条件创建例外.在我的UML中,那些是主流的例外,为什么它不应该是例外?
创建例外的任何指导或最佳实践?
我一直在阅读有关例外及其使用的一些问题和答案.似乎是一种强烈的观点,即只应针对异常,未处理的案例提出例外.这让我想知道验证如何与业务对象一起工作.
假设我有一个业务对象,其中包含对象属性的getter/setter.假设我需要验证该值是否介于10和20之间.这是一个业务规则,因此它属于我的业务对象.所以这似乎意味着我的验证码在我的二传手中.现在我将UI数据绑定到数据对象的属性.用户输入5,因此规则需要失败,并且不允许用户移出文本框..UI被数据绑定到属性,因此将调用setter,规则检查并失败.如果我从业务对象中引发异常以说规则失败,则UI会选择该规则.但这似乎违背了例外的首选用法.鉴于它是一个制定者,你实际上并不会对setter产生"结果".
那么验证应该如何运作呢?
编辑:我可能在这里使用了一个过于简化的例子.上面的范围检查之类的东西可以通过UI轻松处理,但是如果valdation更复杂,例如业务对象根据输入计算数字,如果计算出的数字超出范围,则应该重新注入.这是更复杂的逻辑,不应该在UI中.
还可以考虑根据已输入的字段输入的其他数据.例如,我必须在订单上输入一个项目以获得某些信息,例如库存,当前成本等.用户可能要求此信息做出进一步进入的决定(请说明订购了多少个单位)或者可能需要订购进一步验证.如果该项目无效,用户是否应该能够输入其他字段?重点是什么?
我想知道如何决定:
1)如果要抛出自定义异常或
2)返回一种LOG对象,其中包含'CityNotFound','ReferenceConstraintBroken'等标志.
我一直在阅读例外是昂贵的.如果我只需要知道过程结果的具体细节,对我而言,拥有一个仅包含过程的必要信息的自定义"过程LOG对象"听起来更有益.
所以,如果我回到我的问题:
什么时候更好地抛出一个异常,什么时候更好地返回一些错误日志'对象'?
我刚读完这篇关于异常的优点和缺点的文章,我同意Try-Catch块不应该用于"正常"控制流管理的情绪(不要像goto一样使用它们).然而,一位作者提出了关于可维护性(尤其是性能)的好点,这让我对Try-Finally块中的相同内容感到好奇.
我在我的ASP.NET应用程序中使用Try 包围每个 Connection open事件,以便我可以确保在Finally中关闭Connection.在Web应用程序中泄漏连接显然不是一件好事,我怀疑我是否会改变这种做法,但您有什么想法?
注意:我确实有连接包装在DAL中,并且可以在调用对象析构函数时关闭连接,但这对我来说似乎很粗略.据我所知,你不能指望在异常情况下调用析构函数.我错了吗?
在应用Data Mapper模式时,模型(在我的案例中为Domain Model)负责业务逻辑,而不是将实体保存到数据库的映射器.
构建一个单独的业务逻辑验证器来处理模型之外的用户提供的数据似乎是否合理?
下面是PHP语法中的一个例子.
假设我们有一个实体$person
.假设该实体具有一个surname
在保存时不能为空的属性.
用户输入了非法的空值surname
.由于模型负责封装业务逻辑,$person->surname = $surname;
因此当用户输入的$surname
是空字符串时,我希望以某种方式说操作不成功.
在我看来,$person
如果我们试图用非法值填充其中一个属性,那么应该抛出异常.
但是,从我读过的例外情况来看, "输入'坏'输入的用户也不例外:这是预期的." 其含义是不依赖异常来验证用户数据.
您如何建议解决此问题,在让域模型定义业务逻辑之间取得平衡,而不是依赖于域模型在填写用户输入数据时抛出的异常?
这是我的代码。当用户输入数字以外的其他字符时,它将起作用并向用户发送错误。我需要弄清楚的是,如果他们再次尝试输入字符串,该如何发送相同的错误。
Console.WriteLine("Type in a number and then press enter:");
try
{
num2 = Convert.ToDouble(Console.ReadLine());
}
catch
{
Console.WriteLine("Please Enter a valid numerical value!");
Console.WriteLine("Please enter a valid number and then press enter:");
num2 = double.Parse(Console.ReadLine());
}
Run Code Online (Sandbox Code Playgroud) 我知道这听起来很奇怪,但我需要在每个方法中放置一个包装try catch块来捕获所有异常.我们有数千种方法,我需要以自动方式完成.你有什么建议?
我打算解析所有cs文件并检测方法,并在应用程序中插入try catch块.你能告诉我任何我可以轻松使用的解析器吗?或任何有助于我的事......
每种方法都有其独特的数字,如5006
public static LogEntry Authenticate(....)
{
LogEntry logEntry = null;
try
{
....
return logEntry;
}
catch (CompanyException)
{
throw;
}
catch (Exception ex)
{
logEntry = new LogEntry(
"5006",
RC.GetString("5006"), EventLogEntryType.Error,
LogEntryCategory.Foo);
throw new CompanyException(logEntry, ex);
}
}
Run Code Online (Sandbox Code Playgroud)
我为此创造了这个; http://thinkoutofthenet.com/index.php/2009/01/12/batch-code-method-manipulation/
我正在使用 DDD 和六边形架构在 Typescript 中做一个应用程序,我想知道在哪些情况下我应该在验证中返回 false,以及在哪些情况下我应该抛出异常。
据我所知,当您没有处理该错误时,就会引发异常,您不会期望发生这种情况,但后来我看到更好的程序员也使用 DDD 编写代码,并且他们正在使用未找到异常,显然你应该处理这个问题。
在我的示例中,我想在 valueObject 中进行验证,如下所示:
public static nameValidation(name: string): boolean {
if (Name.containsSpecialChars(name)) {
return false;
}
if (name.length < 2) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我把它作为一个布尔值,在验证不正确的情况下返回 false,但可以很容易地将其更改为异常。
我真的不知道如何区分哪个必须去哪里。
有什么想法吗?
c# ×5
exception ×4
asp.net ×1
class ×1
datamapper ×1
domain-model ×1
parsing ×1
php ×1
status ×1
typescript ×1
validation ×1
vb.net ×1