具体场景如下:
现在要执行一个业务操作方法,这个业务方法执行要有N个前置条件满足才能执行
现在使用统一MVC架构,
调用者要收到反馈,知道没ok,根据反馈进行一些列的后续操作,比如通知用户去哪完善,怎么完善
那么怎么处理?
第一种:N个前置条件的检验,放到action里面做,如果不满足返回相关页面之类的
优点:开发直接简单
缺点:思维直接控制层充斥着这样的业务逻辑,很乱,复用性不强,换个action执行这个,还要再组装
第二种:N个前置条件和业务方法在一块组成一个service方法,直接调用就ok了
作为有追求的coder,我们肯定要第二种,那么第二种问题来了
问题:
这一系列走一流程,写成一个方法完成,那么前置条件到底是第一个不满足,还是第N-1个不满足,怎么得到反馈
抛出异常来通知相关情况
好处:不满足方法的约定,直接给出异常,
缺点:感觉上犯了异常代替了正常流程的问题,不是很确定
通过返回值来通知相关情况但这种检测条件满足否
有点:性能方面,约定一些列的final String 或者 Eunm ,也算直观吧
缺点:方法返回值承载了太多东西,通常不是要直接返回结果
大家有什么看法?转头什么的扔吧
分享到:
相关推荐
当一个函数遇到无法正常处理的情况时,抛出异常是一种常见的处理方式。例如,`UnknownHostException`是Java中的一个异常类型,用于表示无法解析主机名。 函数在正常运行时,返回值类型通常是明确的,例如,一个函数...
7.1 抛出异常 171 7.2 为抛出的异常选择合适的类型 175 7.2.1 错误消息的设计 176 7.2.2 异常处理 177 7.2.3 对异常进行封装 182 7.3 标准异常类型的使用 184 7.3.1 Exception与SystemException 184 ...
7.1 抛出异常 171 7.2 为抛出的异常选择合适的类型 175 7.2.1 错误消息的设计 176 7.2.2 异常处理 177 7.2.3 对异常进行封装 182 7.3 标准异常类型的使用 184 7.3.1 Exception与SystemException 184 ...
3. 对于非 RuntimeException,即 throws 子句声明会抛出的异常,必须在方法的注释中标明。 华为JAVA编码规范提供了详细的编码风格、命名约定、代码组织和注释要求,以确保编写的代码清晰、可读、易维护。同时,规范...
当`main()`抛出异常时,JVM会捕获并打印堆栈跟踪,然后终止程序执行。如果`main()`方法上声明了`throws Exception`,那么它能够抛出任何类型的异常,包括受检查的异常。 4. **使用`main()`方法**: `main()`方法...
在 DispatcherServlet 中对 HandlerExceptionResolver 的处理是在 processHandlerException 方法中进行的,该方法将遍历所有的 HandlerExceptionResolver,直到找到一个可以处理异常的 Resolver,否则将抛出异常。...
主调方在对异步方法所返回的Task对象做await操作时,该对象若已处在faulted状态,系统则会将执行异步方法的过程中所发生的异常抛出,反之,若Task尚未执行到抛出异常的那个地方,则主调方的执行进度会暂停在await...
12. **异常安全的异常处理**:抛出异常时,确保不破坏程序状态,避免在析构函数中抛出异常,并考虑在可能抛出异常的方法中提供无异常的替代途径。 以上只是.NET设计规范中的一部分关键知识点,完整版的规范还包含更...
2. 异常处理:C++的异常不能直接在C#中抛出,需要检查返回值并根据错误代码手动抛出异常。 3. 空间管理:C++的动态内存管理(如`new`和`delete`)在C#中不适用,使用`Marshal.AllocHGlobal`和`Marshal.FreeHGlobal`...
5. **错误处理**:避免使用`assert`进行常规错误检查,而应该使用返回值或抛出异常。`assert`只用于调试阶段,确保程序内部逻辑正确。 6. **内存管理**:推荐使用智能指针(如`std::unique_ptr`和`std::shared_ptr`...
为了保持一致性,C++侧可以抛出异常并将其转换为错误码,然后在C#中捕获错误码并抛出相应的异常。 7. **测试和调试**: - 编译并运行C#程序,测试C++函数的调用。使用Visual Studio的调试器跨语言调试,检查C++和...
- 避免在析构函数和catch块中抛出异常,这可能导致程序难以恢复。 6. **内存管理**: - 使用智能指针(如unique_ptr、shared_ptr和weak_ptr)管理动态分配的对象,减少手动new和delete的使用。 - 避免内存泄漏,...
- **异常处理**: C++可以抛出异常,而C#使用结构化异常处理。如果C++ DLL抛出异常,C#可能无法捕获。考虑使用错误代码返回值或自定义异常处理机制。 - **资源管理**: 跨语言调用时,管理内存和资源需要格外小心。...
构造函数抛出异常是危险的,需要谨慎处理。 6. **`class`与`struct`的区别**:`struct`默认为`public`,但在C++中,两者主要区别在于默认访问权限。避免在`struct`中定义成员函数。 7. **运算符重载**:不推荐过度...
- **使用`raise`重新抛出异常**:在处理异常后,如果需要继续抛出异常,使用`raise`而不直接抛出新的异常。 5. **注释和文档字符串(Comments and Docstrings)** - **模块文档字符串**:每个模块的顶部应有一个...
- 文档注释应包括对该元素的功能、参数、返回值以及可能抛出的异常的描述。 ##### 4.2 行内注释(In-line Comments) - 行内注释用于解释代码中特定部分的目的或逻辑。 - 应避免过多使用行内注释,因为良好的命名和...
4. **异常处理**:应明确处理异常,避免异常传播,同时避免在资源管理函数中抛出异常。在可能抛出异常的代码块前后使用`try-catch`结构,确保资源得到正确释放。 5. **模板与泛型编程**:谨慎使用模板,特别是对于...
- 避免使用`assert`来处理运行时错误,而应抛出异常或返回错误码。 - 异常安全:在可能导致资源泄漏的地方,确保异常发生时能正确清理。 5. **类型安全** - 使用强类型枚举(`enum class`)代替传统枚举,防止...
如果try块中没有可能抛出异常的代码,但却使用了catch语句,则可能会掩盖其他潜在问题。 **示例代码:** ```java try { // 没有可能抛出异常的代码 } catch (Exception e) { // ... } ``` **建议修改:** 删除...
- `throws`:声明方法可能抛出的异常,将异常处理交给调用者。 5. 包和模块系统: - `package`:用于组织和命名空间管理,便于代码重用和避免命名冲突。 - `import`:引入其他包中的类或接口,便于使用。 6. ...