How to have various 'access denied' pages depending on URL
I think you what you need is: hook_node_access($node, $op, $account)
https://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_access/7

Parameters

$node: Either a node object or the machine name of the content type on which to perform the access check.

$op: The operation to be performed. Possible values:

"create"
"delete"
"update"
"view"
$account: The user object to perform the access check operation on.

Base on the return values, you can redirect them to custom error page.
Example:

function hook_node_access($node, $op, $account) {
  $type = is_string($node) ? $node : $node-&gt;type;

  if (in_array($type, node_permissions_get_configured_types())) {
   if ($op == 'create' &amp;&amp; user_access('create ' . $type . ' content', $account)) {
    $query = drupal_get_destination();
    drupal_goto('node/custom-error-page',$query);      
   }
 }