Rails 没在 Rails 代码里见到过 try..catch 和事务管理

congteng · 2012年04月16日 · 最后由 luikore 回复于 2012年08月31日 · 8678 次阅读

首先承认自己是从 java 过来的 最近在读 ruby-china,也尝试写自己的东西 rails 给开发带来了很多便利,同时也带来一些不解

  1. 没见过 controller 里 try..catch 代码
  2. 也没见过显示指定 transaction 的地方

作为初学者,不明白难道 rails 有什么潜在的机制能智能的判断处理这些问题吗

处理异常肯定是有的,不过不是用try catch,而是begin rescue

Java 的 try...catch 对应是 Ruby 的 begin...rescue

RubyChina 是用 MongoDB , 没有了关系数据库的事务概念

而且 Rails 是面向 Web 开发,对事务的要求应该没有企业开发那么高吧

#2 楼 @HungYuHei 谢谢, mongo 没有事务的概念吗,如果没有,怎么保证一个方法里对数据的操作的一致性呢?

我觉得其实应该是有事务的,但是这个网站对于数据要求没有那么高,所以没写也能理解 controller 中为何要异常处理?我觉得 java 中很多时候是把异常处理当做函数返回了,而 ruby 由于语言的关系,返回值类型、数量上都比 JAVA 更灵活,所以很少见到异常处理

#5 楼 @HungYuHei 去看了, 再次感谢 #4 楼 @edokeh 了解了, 谢谢

像 Ruby China 这种网站没必要用事务,万一真遇到错误掉了点数据(其实也就是 counter 之类的)问题也不大。

#8 楼 @huacnlee 一直在想,Rails 里有没有像 Spring 那对事务进行全局控制?

#10 楼 @jhjguxin 十分感谢,非常棒的资源

ruby 里边除了处理异常的raise/rescue,还有throw/catch来处理逻辑

java 里则经常混在一起用

  1. ruby 异常都是运行时异常,通常往外传播就好了,只有 java 有这种烦人的 checked exception 机制强制捕获各种你不处理的异常,java 8 对这种状态改善了不少

  2. rails 可以用数据库事务,没有编程性事务,mongo 没有事务,但你可以用原子操作,只要修改限于一个 document 中就能用原子操作完成。我见过用编程事务操作 mongo 数据的,还不如用 sql 数据库 ...

#14 楼 @hooopo 类似这样的,但实际上还要加锁和保证程序可以结束 (回滚的代码出异常了怎么办?),实现要更麻烦些

需要 登录 后方可回复, 如果你还没有账号请 注册新账号