1 29 30 package com.caucho.quercus.program; 31 32 import com.caucho.quercus.Location; 33 import com.caucho.quercus.env.Env; 34 import com.caucho.quercus.env.NullValue; 35 import com.caucho.quercus.env.QuercusLanguageException; 36 import com.caucho.quercus.env.Value; 37 import com.caucho.quercus.expr.AbstractVarExpr; 38 39 import java.util.ArrayList ; 40 41 44 public class TryStatement extends Statement { 45 protected final Statement _block; 46 protected final ArrayList <Catch> _catchList = new ArrayList <Catch>(); 47 48 public TryStatement(Location location, Statement block) 49 { 50 super(location); 51 52 _block = block; 53 } 54 55 public void addCatch(String id, AbstractVarExpr lhs, Statement block) 56 { 57 _catchList.add(new Catch(id, lhs, block)); 58 } 59 60 public Value execute(Env env) 61 { 62 try { 63 return _block.execute(env); 64 } catch (QuercusLanguageException e) { 65 Value value = e.getValue(); 66 67 for (int i = 0; i < _catchList.size(); i++) { 68 Catch item = _catchList.get(i); 69 70 if (value != null && value.isA(item.getId()) || 71 value == null && item.getId().equals("Exception")) { 72 if (value != null) 73 item.getExpr().evalAssign(env, value); 74 else 75 item.getExpr().evalAssign(env, NullValue.NULL); 76 77 return item.getBlock().execute(env); 78 } 79 } 80 81 throw e; 82 } 83 } 84 85 public static class Catch { 86 private final String _id; 87 private final AbstractVarExpr _lhs; 88 private final Statement _block; 89 90 Catch(String id, AbstractVarExpr lhs, Statement block) 91 { 92 _id = id; 93 _lhs = lhs; 94 _block = block; 95 96 if (id == null) 97 throw new NullPointerException (); 98 } 99 100 public String getId() 101 { 102 return _id; 103 } 104 105 public AbstractVarExpr getExpr() 106 { 107 return _lhs; 108 } 109 110 public Statement getBlock() 111 { 112 return _block; 113 } 114 } 115 } 116 117 | Popular Tags |