message: Fill out action_trace and action_receipt on action execution even when action throws exception. This provides action information even on hard_fail which previously generated a default constructed action_trace.
diff: @@ -33,6 +33,7 @@ action_trace apply_context::exec_one()
  {
  auto start = fc::time_point::now();
  + fc::optional<fc::exception> except;
  const auto& cfg = control.get_global_properties().configuration;
  try {
  const auto& a = control.get_account( receiver );
  @@ -57,8 +58,22 @@ action_trace apply_context::exec_one()
  control.get_wasm_interface().apply( a.code_version, a.code, *this );
  } catch( const wasm_exit& ) {}
  }
  -
  - } FC_RETHROW_EXCEPTIONS(warn, "pending console output: ${console}", ("console", _pending_console_output.str()))
  + } catch( const boost::interprocess::bad_alloc& ) {
  + throw;
  + } catch( fc::exception& e ) {
  + e.append_log( FC_LOG_MESSAGE( warn, "pending console output: ${console}", ("console", _pending_console_output.str()) ) );
  + except.emplace( e );
  + } catch( std::exception& e ) {
  + fc::exception fce( FC_LOG_MESSAGE( warn, "${what}: pending console output: ${console}",
  + ("what", e.what())("console", _pending_console_output.str()) ),
  + fc::std_exception_code, BOOST_CORE_TYPEID( e ).name(), e.what() );
  + except.emplace( fce );
  + } catch( ... ) {
  + fc::unhandled_exception fce( FC_LOG_MESSAGE( warn, "unknown exception: pending console output: ${console}" ,
  + ("console", _pending_console_output.str()) ),
  + std::current_exception() );
  + except.emplace( fce );
  + }
  action_receipt r;
  r.receiver = receiver;
  @@ -84,6 +99,7 @@ action_trace apply_context::exec_one()
  t.act = act;
  t.context_free = context_free;
  t.console = _pending_console_output.str();
  + t.except = std::move( except );
  trx_context.executed.emplace_back( move(r) );
  @@ -94,6 +110,7 @@ action_trace apply_context::exec_one()
  reset_console();
  t.elapsed = fc::time_point::now() - start;
  +
  return t;
  }
  @@ -101,9 +118,13 @@ void apply_context::exec()
  {
  _notified.push_back(receiver);
  trace = exec_one();
  + if( trace.except.valid() )
  + throw *trace.except;
  for( uint32_t i = 1; i < _notified.size(); ++i ) {
  receiver = _notified[i];
  trace.inline_traces.emplace_back( exec_one() );
  + if( trace.inline_traces.back().except.valid() )
  + throw *trace.inline_traces.back().except;
  }
  if( _cfa_inline_actions.size() > 0 || _inline_actions.size() > 0 ) {
  