No se puede capturar Java (Android) Excepción con try-catch

Soy un principiante de Java (Android) (procedente de Python) y estoy tratando de detectar una excepción usando Try-Catch de la siguiente manera:

try { u.save(); } catch (Exception e) { Log.wtf("DO THIS", " WHEN SAVE() FAILS"); } 

Para mi sorpresa, no veo mi mensaje de registro, pero sigo recibiendo el siguiente error:

09-25 10: 53: 32.147: E / SQLiteDatabase (7991): android.database.sqlite.SQLiteConstraintException: código de error 19: falla de restricción

¿Por qué no captura la Excepción? ¿Estoy haciendo algo mal aquí? Todos los consejos son bienvenidos!

El método save () es el siguiente:

 public final void save() { final SQLiteDatabase db = Cache.openDatabase(); final ContentValues values = new ContentValues(); for (Field field : mTableInfo.getFields()) { final String fieldName = mTableInfo.getColumnName(field); Class<?> fieldType = field.getType(); field.setAccessible(true); try { Object value = field.get(this); if (value != null) { final TypeSerializer typeSerializer = Cache.getParserForType(fieldType); if (typeSerializer != null) { // serialize data value = typeSerializer.serialize(value); // set new object type if (value != null) { fieldType = value.getClass(); // check that the serializer returned what it promised if (!fieldType.equals(typeSerializer.getSerializedType())) { Log.w(String.format("TypeSerializer returned wrong type: expected a %s but got a %s", typeSerializer.getSerializedType(), fieldType)); } } } } // TODO: Find a smarter way to do this? This if block is necessary because we // can't know the type until runtime. if (value == null) { values.putNull(fieldName); } else if (fieldType.equals(Byte.class) || fieldType.equals(byte.class)) { values.put(fieldName, (Byte) value); } else if (fieldType.equals(Short.class) || fieldType.equals(short.class)) { values.put(fieldName, (Short) value); } else if (fieldType.equals(Integer.class) || fieldType.equals(int.class)) { values.put(fieldName, (Integer) value); } else if (fieldType.equals(Long.class) || fieldType.equals(long.class)) { values.put(fieldName, (Long) value); } else if (fieldType.equals(Float.class) || fieldType.equals(float.class)) { values.put(fieldName, (Float) value); } else if (fieldType.equals(Double.class) || fieldType.equals(double.class)) { values.put(fieldName, (Double) value); } else if (fieldType.equals(Boolean.class) || fieldType.equals(boolean.class)) { values.put(fieldName, (Boolean) value); } else if (fieldType.equals(Character.class) || fieldType.equals(char.class)) { values.put(fieldName, value.toString()); } else if (fieldType.equals(String.class)) { values.put(fieldName, value.toString()); } else if (fieldType.equals(Byte[].class) || fieldType.equals(byte[].class)) { values.put(fieldName, (byte[]) value); } else if (ReflectionUtils.isModel(fieldType)) { values.put(fieldName, ((Model) value).getId()); } else if (ReflectionUtils.isSubclassOf(fieldType, Enum.class)) { values.put(fieldName, ((Enum<?>) value).name()); } } catch (IllegalArgumentException e) { Log.e(e.getClass().getName(), e); } catch (IllegalAccessException e) { Log.e(e.getClass().getName(), e); } } if (mId == null) { mId = db.insert(mTableInfo.getTableName(), null, values); } else { db.update(mTableInfo.getTableName(), values, "Id=" + mId, null); } Cache.getContext().getContentResolver() .notifyChange(ContentProvider.createUri(mTableInfo.getType(), mId), null); } 

Hay dos clases para captar los problemas.

  1. Error
  2. Excepción

Ambos son subclase de clase Throwable . Cuando hay una situación que no sabemos, ese bloque de código en particular lanzará Excepción o Error? Puede usar Throwable . Throwable captura errores y excepciones .

Hacer de esta manera

 try { u.save(); } catch (Throwable e) { e.printStackTrace(); } 

Por lo general, la restricción falló que se hizo algo como pasar un valor null a una columna que se declara como no null cuando se crea la tabla.

Hacer de esta manera

 try { // do some thing which you want in try block } catch (JSONException e) { e.printStackTrace(); Log.e("Catch block", Log.getStackTraceString(e)); } 

Tratar

 try { u.save(); } catch (SQLException sqle) { Log.wtf("DO THIS", " WHEN SAVE() FAILS"); }catch (Exception e) { Log.wtf("DO THIS", " WHEN SAVE() FAILS"); } 

Log está esperando ciertos nombres de variables como verbose (v), debug (d) o info (i). Su "wtf" no pertenece allí. Marque esta respuesta para más información ->

https://stackoverflow.com/a/10006054/2074990

o esto:

http://developer.android.com/tools/debugging/debugging-log.html

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.