Best practice for copying tables from server to server
This looks like a good working solution. Keep in mind however, that copying large amounts of data within a transaction will potentially grow your logfiles significantly. That costs a lot of time and can cause unexpected drive space shortages. Also, during that time the target tables are completely unaccessible for outside connection. The source tabes might also be blocked, depending on you transaction isolation level.

It might be better to break the actual data movement down into small batches. But then you would loose transactional consistency if concurrent writes happen.

As Aaron mentioned, you might also want to look into existing tools like DataCompare (would also not guarantee transactional consistency). If you have to execute this copy process regularly, you could also look into snapshot replication. (This would guarantee transactional consistency, but it would need to be setup by a sysadmin. However, after that initial setup you could start the synchronization yourself.)

Finally, if you go with your solution, make sure that in the error condition you first rollback the transaction and then record to the error log table, otherwise you would rollback that new entry too. You should also check that there is actually a transaction at the time of the error: IF XACT_STATE() != 0 ROLLBACK