Cómo atrapar la excepción de gasolina

Según mi conocimiento, no hay excepciones personalizadas en la solidez. La única excepción es Out of Gas. Dondequiera que escribamos throwen código de contrato, arroja out-of-gasuna excepción.
Pero, ¿hay alguna manera de que pueda detectar esa excepción? Quiero decir, si puedo ejecutar un fragmento de código cada vez que se produce una excepción. Incluso al trabajar con la consola geth, no recibí ninguna notificación sobre si se produjo alguna excepción.
Creo que es bastante posible detectar tal excepción, porque Mist puede mostrar Intrinsic gas too lowun mensaje de error cada vez que ocurre una excepción, por lo que debe haber manejado esa excepción en alguna parte.
Editar:
Básicamente la pregunta es:

¿Cómo podemos saber, antes de enviar la transacción, que esta transacción consumirá todo el gas proporcionado?

No estoy preguntando cómo puedo proporcionar suficiente gasolina para mi transacción, sino cómo puedo saber que mi transacción se quedará sin gasolina.
Una forma de hacerlo es enviar la transacción, dejar que se extraiga y luego verificar gasUsed=gasSendsi hay thowuso debug.traceTransaction.

Pero quiero saber si mi transacción se realizará o no sin enviar la transacción. En Mist, cada vez que intento enviar una transacción que encontrará una throwdeclaración, se muestra Intrinsic gas too lowantes de enviar la transacción. Quiero hacer lo mismo desde geth.

Respuestas (2)

Solidity no ofrecía un mecanismo de gestión de excepciones como try/catch (para Java/c#).

debido a un código EVM no válido, throw consume todas las terminaciones de gas proporcionadas y revierte todos los cambios al estado realizados por la ejecución del contrato actual y a los saldos de Ether. este concepto pretende evitar el spam en la red.

en el Libro Amarillo se menciona que:

Al igual que con la creación del contrato, si la ejecución se detiene de manera excepcional (es decir, debido a un suministro de gas agotado, flujo insuficiente de la pila, destino de salto no válido o instrucción no válida), entonces no se reembolsa el gas a la persona que llama y el estado se revierte al punto inmediatamente antes de la transferencia de saldo (es decir, σ)

como información para el mensaje de “gas intrínseco demasiado bajo”

Mist verifica la cantidad de gas sin ejecutar ningún código y le dice que la transacción fallará porque no proporcionó suficiente gas para ejecutar la transacción.

Conozco los hechos que mencionaste, pero esto no resuelve mi problema. Probablemente me entendiste mal. Estaba preguntando sobre la captura de la out-of-gasexcepción, para poder mostrar un mensaje como lo hace Mist.
eso es lo que quiero decir con mecanismo de prueba/captura, la solidez no proporcionó eso.
puede usar eventos cuando espera que se dispare una excepción
Me preguntaba si no existe tal mecanismo, cómo Mist puede mostrar un mensaje de error cada vez que ocurre una excepción
Gas intrínseco demasiado bajo, esto no es una excepción MIST, solo verifique la cantidad de gas y luego le da este error
Mira, no importa la cantidad de gas que proporciones, cada vez que hacemos throwuna excepción, todo el gas se consume y, por lo tanto, aparece Mist Intrinsic gas too low. Pero, si realiza la misma transacción desde geth console, las transacciones se envían, pero después de la minería cuando lo depura, dará invalid jump destination (PUSH1) 2. Lo que quiero es que pueda evitar que la transacción se envíe tal como lo hace Mist, si hay excepciones en algún lugar o si la transacción consume todo el combustible.

Si desea estimar el gas como lo hace Mist, puede llamar a estoeth_estimateGas :

Realiza una llamada o transacción, que no se agregará a la cadena de bloques y devuelve el gas usado, que se puede usar para estimar el gas usado.

sí, esta es la única solución, pero ¿cómo puedo llamar al método de contrato usando web3.eth.call. Quiero decir, cómo obtener el dataparámetro, si quiero llamar a una función como transfer("to_addr", amount, { from: "accnt_addr});usar web3.eth.call().
eth_estimateGas me dará una cantidad estimada de gas, pero ¿cómo sabré que mi transacción consumió todo el gas?
Cuando haga el .call(param, { gas:3000000 }), ¿estimará el gas en 3000000? 3000000 es mucho.
sí, pero ¿y si la función que estoy invocando se usa throwen alguna línea? Consumirá todo el gas, sin importar cuán grande sea el valor. Entonces, si quiero saber si mi código throwsen alguna línea o no, la mejor manera de hacerlo, supongo, es verificar si la transacción se quedó sin gasolina. No estoy preguntando enhow can I provide sufficient gas for my transaction but How can I know beforehand that my transaction will run out of gas?
He actualizado la pregunta, espero que esto ayude a comprender mejor el caso.
Si das gas de 3000000 o 4700000, dependiendo de cuál sea el gas máximo del bloque, le das el gas máximo posible a tu transacción. Así que si tira consume todo el gas, por grande que sea el valor. Pero debido a que diste el valor máximo, sabes que tiró.
No estoy hablando de enviar la transacción desde Mist, sino desde geth console. En ese caso, ¿cómo sabré que mi transacción puede fallar antes de enviar la transacción?
eth.estimateGas({ from: account, to: myContract.address, data: myContract.myFunction.getData(param1, param2) })está disponible en geth console.
Genial, ahora lo entiendo, en realidad cada vez que una transacción arroja el archivo Estimated gas=50000000. Entonces, puedo poner un cheque como if(EstimatedGas=50000000){console.log("transaction may fail")};. Pero esto planteó una nueva pregunta de ¿por qué 50000000? ¿Es el límite máximo de gas de la transacción Ethereum?
El término que necesita para Google es "límite de gas de bloque".
Gracias por la ayuda. Ahora estoy atascado en el uso eth_estimateGasde funciones que no toman ningún parámetro de entrada. Para evitar discusiones aquí, abrí una nueva pregunta ¿Cómo estimar el gas para una función sin ningún parámetro de entrada? . Por favor échale un vistazo.